我想匹配任何前面没有x的数字,也没有跟在和之后。 我想出了这样的事情: (?<!x)(\d+)(?!y)
正则表达式断言 - 无论是或两者都没有
然而,这并不能真正帮助,我也希望像x123
或456y
字符串匹配的数字。
换句话说,我希望两个断言都可以工作,或者不需要任何断言。
实例:
- 从 “X123”, “123” 将被匹配
- 从 “456y”, “456” 将被匹配
- 从 “789”, “789” 将是与之匹配
- 没有什么会从 “x123y”
你能帮请相匹配?
我想匹配任何前面没有x的数字,也没有跟在和之后。 我想出了这样的事情: (?<!x)(\d+)(?!y)
正则表达式断言 - 无论是或两者都没有
然而,这并不能真正帮助,我也希望像x123
或456y
字符串匹配的数字。
换句话说,我希望两个断言都可以工作,或者不需要任何断言。
实例:
你能帮请相匹配?
(?<!\d)(?!(?<=x)\d+(?=y))\d+
基本上,你为你创造做什么不想要匹配一个正则表达式 - (?<=x)\d+(?=y)
- 并把它放在负面的希望元首。如果成功,您可以继续并使用数字。但这还不够,因为它仍然会在x123y
中匹配23
。为一位数字添加负反向后,可确保匹配仅在数字运行开始时开始。
如果你不需要它作为一个单一的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 +之后,可能有任何数字。
(?!x\d+y)x?(\d+)y?
基本上,你断言,如果你不整体匹配才会成功有x
其次\d+
,接着是y
。然后,继续匹配号码(您需要包含可选的x
和y
以匹配x123
和123y
,但您从该断言中知道,您将永远不会匹配x
和y
)。
以下是Java中的一个简单的test。
一个解决方案:
(\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
数字是更大字符串的一部分吗?还有哪种语言? – FailedDev
@FailedDev是的。该语言是PHP。 – JirkaVebr