2011-12-11 80 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