我想匹配任何前面沒有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