2012-02-16 29 views

回答

5

對於你的榜樣,你可以這樣做:

\b[a-z]*(_[a-z]*){3}[a-z]*\b 

(與忽略大小寫標誌)。

你可以用它玩here

它說:「匹配0或多個字母,其次是‘_ [A-Z] *’正好三次,其次是0個或多個字母」。 \b的意思是「單詞邊界」,即「匹配整個單詞」。

因爲我已經使用'*',所以如果單詞中有三個「_」,無論它出現在單詞的開始還是結尾,都會匹配 - 否則可以修改它。

此外,我假設你想要匹配一個字符串中的所有單詞,其中只有三個「_」。

這意味着字符串「a_b a_b_c_d」會說「a_b_c_d」通過(但「a_b」失敗)。

如果你的意思是全球跨越整個字符串你只需要三「_」出現,然後使用:

^[^_]*(_[^_]*){3}[^_]*$ 

此錨定的正則表達式在字符串的開始和去最後,確保其中只有三次出現「_」。

+0

\ B [AZ] *(_ [AZ] *){3} [AZ] * \ b正是我所需要的。大! – Tucker 2012-02-16 02:44:36

+0

請注意,只有當下劃線用小寫字母字符(即字母)分隔時,這纔會起作用。 – 2014-09-23 18:44:10

1

這應做到:

^[^_]*_[^_]*_[^_]*_[^_]*$ 
0

如果你的例子是唯一的可能性(如a_b_c _...),那麼其他人都很好,但我寫了一個可以處理其他可能性的例子。如:

a__b_adf 
a_b_asfdasdfasfdasdfasf_asdfasfd 
___ 
_a_b_b 

等等

這裏是我的正則表達式。

\b(_[^_]*|[^_]*_|_){3}\b 
+0

該解決方案似乎不起作用。 – 2014-09-23 18:35:44

1

在闡述雷達的答案,這是迄今爲止最多元,但可能是一個痛苦的,如果有更多的事件來匹配寫:

^([^_]*_){3}[^_]*$ 

它將匹配整個字符串(從開始^到端$),其中恰好有3({3})倍包括0個或多個(*)倍的任何字符不被下劃線([^_])和一個下劃線(_)的圖案,整個被後跟0或多個時代的任何特徵除了下劃線之外([^_]*,再次)。

當然一個可替代基團的其他方式圓形,如在我們的情況下,圖案是對稱的:

^[^_]*(_[^_]*){3}$ 
相關問題