2009-12-09 20 views
2

我不知道它是否真的很簡單,我從我的腦海....經常不匹配兩種表達強調

在Ruby的正則表達式,如何搭配不包含兩個連續的字符串下劃線,即「__」。

例:

Matches: "abcd", "ab_cd", "a_b_cd", "%*##[email protected]+" 
Does not match: "ab__cd", "a_b__cd" 

-Thanks

編輯:我不能使用反向邏輯,即檢查 「__」 的字符串,不包括他們,因爲需要與Ruby on Rails的使用「 validates_format_of()「,它需要一個與匹配的正則表達式

+1

我認爲這是'validates_format_of'中的一個設計錯誤。它應該是一個通用的謂詞。正則表達式是一個實現細節。 – Svante 2009-12-09 12:46:38

回答

3
/^([^_]*(_[^_])?)*_?$/ 

測試:

regex=/^([^_]*(_[^_])?)*_?$/ 

# Matches  
puts "abcd" =~ regex 
puts "ab_cd" =~ regex 
puts "a_b_cd" =~ regex 
puts "%*##[email protected]+" =~ regex 
puts "_" =~ regex 
puts "_a_" =~ regex 

# Non-matches 
puts "__" =~ regex 
puts "ab__cd" =~ regex 
puts "a_b__cd" =~ regex 

但正則表達式是矯枉過正了這個任務。簡單的字符串測試要容易得多:

puts ('a_b'['__']) 
+0

工程很好,看起來很「不復雜」(比較)。另外,感謝您花時間寫這些例子。我只需要對我的irb會話進行「複製粘貼」以進行驗證。另外,另一個正確的答案 - http://stackoverflow.com/questions/1873436/regular-expression-for-not-matching-two-underscores/1873474#1873474 – 2009-12-09 12:43:55

0

負先行

\b(?!\w*__\w*)\w+\b 

搜索從字開頭的下一個字的兩個連續的下劃線,而如果沒有找到相匹配的詞。

編輯:爲了適應比在比賽中的空格其他任何東西:

(?!\S*__\S*)\S+ 

如果你想以適應符號的一個子集,你可以寫類似以下,但隨後會從a_b__cd匹配_cd中其他事情。

(?![a-zA-Z0-9_%*#@+]*__[a-zA-Z0-9_%*#@+]*)[a-zA-Z0-9_%*#@+]+ 
+0

'\ w'不包含'_'。 – Gumbo 2009-12-09 12:03:14

+0

@Gumbo:\ w代表「單詞字符」,通常是[A-Za-z0-9_]。注意包含下劃線和數字 – Andomar 2009-12-09 12:06:05

+0

@Gumbo http://www.regular-expressions.info/charclass.html說'\ w'包含'_' – Amarghosh 2009-12-09 12:07:46

9

你可以使用負前瞻:

^((?!__).)*$ 

的開始子串^和字符串的結尾$是重要的,他們迫使「後面沒有雙下劃線」支票上的每一個位置。

+1

在Ruby中,''''和'$'分別是行首和行尾(對於包含多行的字符串)。嚴格地說,使用'\ A'和'\ Z'作爲字符串開頭和字符串結尾 – 2009-12-09 12:26:45

+0

謝謝,效果很好。但不幸的是,我只能選擇一個答案,所以選擇了「馬克·拜爾斯」,因爲他的解決方案很簡單。儘管如此,肯定是+1。 – 2009-12-09 12:42:08

+0

昨天,我沒有選擇你接受的答案,因爲那時我不知道有關「負面看法」的事情,但現在我知道了。所以,現在我發現你的答案就像「哇」。我試圖修改它,但沒有得到任何改善。 感謝您的回答。 – 2009-12-10 05:03:40

2

會改變你的邏輯仍然有效嗎?

您可以檢查字符串是否包含兩個帶正則表達式[_] {2}的下劃線,然後忽略它?