2011-12-11 77 views
3

我想匹配任何前面没有x的数字,也没有跟在之后。 我想出了这样的事情: (?<!x)(\d+)(?!y)正则表达式断言 - 无论是或两者都没有

然而,这并不能真正帮助,我也希望像x123456y字符串匹配的数字。

换句话说,我希望两个断言都可以工作,或者不需要任何断言。

实例:

  • 从 “X123”, “123” 将被匹配
  • 从 “456y”, “456” 将被匹配
  • 从 “789”, “789” 将是与之匹配
  • 没有什么会从 “x123y”

你能帮请相匹配?

+0

数字是更大字符串的一部分吗?还有哪种语言? – FailedDev

+0

@FailedDev是的。该语言是PHP。 – JirkaVebr

回答

2
(?<!\d)(?!(?<=x)\d+(?=y))\d+ 

基本上,你为你创造做什么不想要匹配一个正则表达式 - (?<=x)\d+(?=y) - 并把它放在负面的希望元首。如果成功,您可以继续并使用数字。但这还不够,因为它仍然会在x123y中匹配23。为一位数字添加负反向后,可确保匹配仅在数字运行开始时开始。

0

如果你不需要它作为一个单一的PCRE表达,但如果你有额外的控制结构的可能性,只是普通的代码,你可以不喜欢它

#!/usr/bin/perl 

foreach $_ (qw(x123 456y x789y)) { 
    while ($_ =~ /\d+/g) { 
      print "$_\n" if !!(substr($`, -1, 1) ne "x")^
          !!(substr($', 0, 1) ne "y"); 
    } 
} 

这里是PCRE(单-expr):

foreach $_ (qw(x123 456y x789y)) { 
    print "$_\n" if 
      /\D*\d+(?!\d)(?!\D)|(?<!x)(?<!\d)\d+\D*/; 
} 

说明: 交替1:它被允许具有非数字(\ d),则一串数字必须遵循\ d +,如果是这样,必须没有数字尾随(服务使它不会以“x789”之外的匹配“x78”),也不会有非d igit。 交替2是确切的反转,即在第一个匹配的数字之前必须没有x和没有数字,在\ d +之后,可能有任何数字。

0
(?!x\d+y)x?(\d+)y? 

基本上,你断言,如果你整体匹配才会成功有x其次\d+,接着是y。然后,继续匹配号码(您需要包含可选的xy以匹配x123123y,但您从该断言中知道,您将永远不会匹配xy)。

以下是Java中的一个简单的test

0

一个解决方案:

(\b\d+|\d+\b) 

测试perl

内容

脚本。PL

use warnings; 
use strict; 

while (<DATA>) { 
    printf qq[$1\n] if m/(\b\d+|\d+\b)/; 
} 

__DATA__ 
x123 
456y 
789 
x123y 

运行程序:

perl script.pl 

结果:

123 
456 
789