2013-10-11 19 views
1

我正在尋找一個正則表達式,它將匹配由[]封裝的下劃線分隔的兩個字符串的組合。每個實例都必須匹配,當兩個字符串都是大寫單詞時,exept會被解除。正則表達式匹配所有[string_string] exept當兩個單詞都滿帽

什麼我至今是:

\[(([A-z](?=[a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+_(([A-z](?![a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+\] 

應該匹配一切exept情況類似這樣:

[ONLYCAPS_ONLYCAPSTOO] 

提前感謝!

忘了提及:字符串還可以包含特殊字符和空白字符。

回答

2

任何你需要在這種情況下使用負前瞻。下面的正則表達式將工作:

\[(?![A-Z]+_[A-Z]+\])[a-zA-Z]+_[a-zA-Z]+\] 

分手:

\[   # Start with '[' 
    (?!   # See if not followed by 
     [A-Z]+  # Upper case letters one or more times 
     _   # An underscore 
     [A-Z]+  # Upper case letters one or more times 
     \]   # Till the ending ']' 
    )   # Negative look-ahead ends 
    # If negative look-ahead succeeds, perform actual match. 
    [a-zA-Z]+ # Match upper or lowercase alphabets one or more times 
    _   # An underscore 
    [a-zA-Z]+ # Match upper or lowercase alphabets one or more times 
\]   # Ending ']' 
+0

這工作幾乎是這樣,我忘了提及它還必須匹配字符串與特殊字符(exept _ becouse它只能出現一次)。但我會在第二個理由中接受這個理由,說明爲什麼我會這樣做。 –

+1

@BartKuijer無論你想匹配什麼特殊字符,你都可以把它放在字符類 - '[a-zA-Z] +'中。或者如果您不確定要匹配的所有特殊字符,只需使用'[^ ​​_] +'匹配除'_'之外的任何字符。 –

0

你可以試試這個正則表達式負先行(如果lookarounds在您的正則表達式工具支持):

(?!^\[[A-Z]+_[A-Z]+\]$)\[(([A-z](?=[a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+_(([A-z](?![a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+\] 
2

你應該做這種方式

(?!\[[A-Z]+_[A-Z]+\])\[[^_]+_[^_]+\] 
--------------------- -------------- 
     |     |->desired result 
     | 
     |->won't match further if there's [ONLYCAPS_ONLYCAPSTOO] ahead 

(?!pattern)是零寬度lookahead ..它只會檢查,但不匹配!

[^_]將匹配除了_

+0

的解釋將是有益的(或者至少狀態,它遵循同樣的邏輯,另一個海報的答案,但在特定的不同辦法)。 – AJMansfield

+0

@AJMansfield確實..編輯回答..謝謝.. – Anirudha

相關問題