我想匹配任何前面没有 x 的数字,也不会跟着 y 。
我提出了这样的事情:
(?<!x)(\d+)(?!y)
然而,这并没有多大帮助,因为我还希望匹配x123
或456y
等字符串中的数字。
换句话说,我希望两个断言都能正常工作或者没有断言。
示例:
你能帮帮忙吗?
答案 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
,则断言整体匹配才会成功}。然后,您继续匹配该号码(您需要包含可选的x
和y
以匹配x123
和123y
,但您从断言中知道,你永远不会匹配x
和y
)。
这是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