2011-05-31 60 views
1

有人可以用正則表達式來幫助我找到使用這個規則的語句嗎?正則表達式也有一定的字母,並且至少有一個字母組合

字需要具有字母 「J U,G」(只是字母不是順序),並且這些字母中的至少一個:G,L,E,R,S

,所以我可以搜索壺,雜耍,雜技,玩雜耍,列表等

感謝

+1

但您的示例'lugger'沒有全部的'J','U'和'G' – anubhava 2011-05-31 22:53:27

+0

抱歉,已更新。 – Kamran224 2011-05-31 23:24:47

+1

沒有意義。需要和至少有什麼區別?爲什麼G在兩個? – manojlds 2011-05-31 23:28:36

回答

0

你的問題完全不借給自己的正則表達式很好的第一部分。這種模式最終會導致混亂,並且只會增加更多所需字符。

第二部分,但是,很簡單:

m/[glers]/i 

所以我建議兩個部分實施解決方案。這取決於你的語言:

Ç#(使用LINQ)

var chars = "GJU"; // characters are sorted. 
if (inputstring.ToUpper().Intersect(chars).OrderBy(c => c).SequenceEqual(chars)) { 
    // do stuff if match. 
} 

的Perl(需要5.10)

my @chars = sort split '', 'GJU'; # Transform into sorted array. 
my %input = map{($_, 1)} split '', uc $inputstring; # stores unique chars from string. 
if (@chars ~~ %input) { # Smart match performs hash key intersection. 
    # Do stuff in here. 
} 

的Python

chars = set('jug') 
input = set(inputstring) 
if chars == (chars & input): 
    # do something here 
2

還有一個正則表達式的解決方案。但是,你應該真的給你使用的語言,因爲可以有其他更好的解決方案,正如@Quick Joe Smith寫的。

^(?=.*J)(?=.*U)(?=.*G)(?=.*[LERS]).*$ 

查看Rubular

那些(?=)是正面看上去aheads,他們檢查是否有字符串中的字符,但它們不匹配。最後.*將匹配您的完整字符串。

您還需要修改i打開忽略大小寫(不區分大小寫)

+0

我正在使用java,如果有幫助 – Kamran224 2011-06-03 01:36:26

0

如果你用一個詞在同一時間工作,試試這個:

boolean isMatch = s.matches(
    "(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"); 

如果你正在尋找在一個較長的字符串匹配:

Pattern p = Pattern.compile(
    "(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    String foundString = m.group(); 
} 

每次第一四種備選方法之一 - J()U()G()[GLERS]() - 匹配一些東西,它後面的空組「捕獲」什麼(即空字符串)。當到達字符串末尾時,每個反向引用 - \1,\2等 - 嘗試匹配與其對應組匹配的相同內容:不再有任何內容。

很顯然,這將永遠成功;你可以隨時匹配註釋。訣竅是反向引用甚至不會嘗試匹配,如果其相應的組沒有參與匹配。也就是說,如果目標字符串中沒有j,則J()備選中的()永遠不會涉及。當正則表達式引擎稍後處理反向引用時,它會立即報告失敗,因爲它知道該組未參與匹配。

通過這種方式,空的組的行爲就像一個複選框,反向引用確保所有的框都被檢查過。雖然有一個皺紋。 G()[GLERS]()替代方案都可以匹配g;你如何確保他們在需要時參加比賽?第一個正則表達式我試過了,

"(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4" 

...未能匹配單詞「jugg」因爲G()替代被消耗都g的; [GLERS]()從未有機會參與。所以我增加了負面預測 - (?!.*G) - 現在它只匹配最後g。如果我有三種替代方案可以匹配g,那麼我必須將第一個(?!.*G.*G)(?!.*G)加到第二個。但實際上,在我達到這一點之前,我可能會轉向另一種方法(可能不涉及正則表達式)。 ;)

相關問題