Regexp断言 - 无论是两者还是无

时间:2011-12-11 23:15:57

标签: php regex

我想匹配任何前面没有 x 的数字,也不会跟着 y 。 我提出了这样的事情: (?<!x)(\d+)(?!y)

然而,这并没有多大帮助,因为我还希望匹配x123456y等字符串中的数字。

换句话说,我希望两个断言都能正常工作或者没有断言。

示例:

  • 来自“x123”,“123”将匹配
  • 来自“456y”,“456”将匹配
  • 来自“789”,“789”将匹配
  • “x123y”
  • 没有任何内容可以匹配

你能帮帮忙吗?

4 个答案:

答案 0 :(得分:2)

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

基本上,您为想要匹配的内容创建一个正则表达式 - (?<=x)\d+(?=y) - 并将其置于负面预测中。如果成功,您可以继续使用数字。但这还不够,因为它仍会与23中的x123y匹配。为数字添加负向lookbehind可确保匹配仅在数字运行开始时开始。

答案 1 :(得分: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 +,如果是这样,必须没有数字尾随(服务使它不会最终只匹配“x78” “超出”x789“),也没有非数字。 交替2是完全相反的,即在第一个匹配的数字之前必须没有x和没有数字,在\ d +之后,可能有任何数字。

答案 2 :(得分:0)

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

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

这是Java中的简单test

答案 3 :(得分:0)

一个解决方案:

(\b\d+|\d+\b)
perl中的

测试

script.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