2011-01-14 91 views
0

我有一個正則表達式正則表達式包圍()問題

(\\w+[ ]*|-\\w+[ ]*)(!=|<=|>=|=|<|>| not in | in | not like | like)(.*) 

這3個部分由逗號sepearted。

當我嘗試匹配這個對像

product(getProduct_abc) in (Xyz) 

它不匹配的正則表達式。

但是,當我嘗試匹配

100=product(getProduct_abc) in (Xyz) 

它完美匹配。

正則表達式有什麼問題?

+0

它看起來就像你正在試圖做太多的一個正則表達式。分解並正確解析字符串。 – 2011-01-14 03:08:17

回答

0

正則表達式本身沒有任何問題。它只是不匹配指定的字符串。

你需要找到自己對正則表達式的很好的參考,並學習基礎知識。一個是http://www.regular-expressions.info/。對於初學者來說,這可能是也可能不是一個很好的參考。 (我使用他的使用RegexBuddy工具來測試你的正則表達式)

這裏是表達的大概分類:

  • 有三種拍攝組,每組由自己對括號包圍。 (請注意,圓括號和許多其他字符在正則表達式中有特殊含義,所以要匹配任何一個方向的括號都需要將其轉義。給定的正則表達式不會這樣做。)
  • 在第一次捕獲小組有兩種可能的選擇進行比賽。它們是:
    • 一個或多個「詞」字符,隨後是零個或多個空格,或
    • 破折號,後面跟着一個或多個「字」字符,隨後是零個或多個空格
  • 在在第二個捕獲組中,有10個可能的匹配:列出的運算符符號(沒有周圍空格)或列出的文本運算符(與周圍空格)
  • 在第三個捕獲組中,零個或多個任何字符都匹配。

字符串「產品(getProduct_abc)在(XYZ)」不匹配,因爲「in」操作之前有不只是「詞」字符。括號不被視爲「單詞」字符,因此會導致匹配失敗。 ('Xyz')中的第二個字符串('100 = product(getProduct_abc)')匹配,因爲它使用equals('=')作爲第二個捕獲組的匹配運算符,'100'是所有字符串「單詞」字符,並且'='後的所有內容都與「任何字符」部分匹配,所以匹配成功。請注意,根據處理字符串末尾的方式,如果字符串位於字符串的最後,某些語言可能不匹配該字符串。

如果第一個字符串是假設要匹配,那麼您需要檢查您的業務用戶。也許他們也是有正則表達式的初學者,並給你一個不起作用的東西。;-)

0

這是我所看到的:

'100=product(getProduct_abc) in (Xyz)' 
Group1 match = '100' 
Group2 match = '=' 
Group3 match = 'product(getProduct_abc) in (Xyz)' 

'product(getProduct_abc) in (Xyz)' 
     ^ 
    Fails here on Group1 match because parenthesis are not included in this group 

通過強制1,2,3組比賽的最後一次出現在字符串中的修復情況。
修復/重寫等價Group1匹配和分離組,它們可以重新組合以強制最後的匹配成爲可能。

rxP1 = '(?:-?[\w()]+\ *)'; 
rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like)'; 
rxP3 = '(?:.*?)'; 

rxAll = /(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/; 

在Perl:

use strict; 
use warnings; 

my @samples = (
'product(getProduct_abc) in (Xyz1)', 
'100=product(getProduct_abc) in (Xyz2)', 
'100 like = != not like >product(getProduct_abc) in (Xyz3)', 
); 

my $rxP1 = '(?:-?[\w()]+\ *)'; 
my $rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like)'; 
my $rxP3 = '(?:.*?)'; 

for (@samples) 
{ 
    if (/(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/) { 
     print "\n1 = '$1'\n"; 
     print "2 = '$2'\n"; 
     print "3 = '$3'\n"; 
    } 
} 

輸出:

1 = 'product(getProduct_abc)' 
2 = ' in ' 
3 = '(Xyz1)' 

1 = 'product(getProduct_abc)' 
2 = ' in ' 
3 = '(Xyz2)' 

1 = 'product(getProduct_abc)' 
2 = ' in ' 
3 = '(Xyz3)'