2016-10-12 68 views
0

我正在使用Rails 4.2.7。我想匹配一個表達式並利用單詞邊界表達式,因爲可能有空格,任意數量的空格或我的單詞之間的短劃線。但是,這是行不通的爲什麼「 b」在Rails中沒有捕捉到我的單詞邊界?

2.3.0 :006 > /first\bsecond/.match('first second') 
=> nil 

該手冊在這裏 - https://ruby-doc.org/core-2.1.1/Regexp.html表明,「\ B」是正確的表達式中使用捕捉字邊界所以我不知道我要去哪裏錯了。

+0

見http://stackoverflow.com/questions/39875620/python-regex-words-boundary-with-unexpected-results/39876126#39876126。 '\ b'不匹配空格,'first'和'second'之間有一個。 –

+1

'\ b'通常只用在表達式的開頭或結尾,因爲它在其他地方的用處是有問題的。 – tadman

+0

@tadman在表達式中有''b''可能會有用的機會,但是我很難想象真實世界的用例。類似這樣的用法很有效:'/ [az] \ b [az] /' – Sam

回答

1

\b匹配零長度的字邊界,而不是空格。您正在尋找更多的東西是這樣的:

/first\b.\bsecond/.match('first second') 

這將匹配任何字符(.firstsecond之間,只要有任何一方單詞邊界。


然而,這不是字邊界是如何常用(因爲沒有必要使用,當你邊界本身相匹配的單詞長度爲零的檢查)。 \b實質上是在一個單詞字符之後尋找一個非單詞字符;所以,相反,你可以只尋找在firstts之間,非字字符second

/first\Wsecond/.match('first second') 

這是完全一樣的第一個例子......但是,實際上,你可能只是想匹配的空白,並且可以使用這樣的事情:

/first\ssecond/.match('first second') 

@WiktorStribiżew的第三個例子顯示的字邊界的最佳使用(開頭和結尾)。這是因爲你之前或之後沒有匹配任何東西,所以零長度測試是有幫助的。否則,上面的例子可以匹配first secondary之類的東西。最後,我會使用像表達式:

/\bfirst\ssecond\b/.match('first second') 
+1

或者'/ first \ ssecond /'或'/ first second /'或'/ \ bfirst second \ b /' –

+0

Thanks @WiktorStribiżew,我只是更新問題來解釋爲什麼你通常不會使用零長度在這樣的情況下匹配。 – Sam

+0

謝謝,但給出的答案在/ first \ Wsecond/.match('第一秒')的情況下失敗,因爲單詞之間有多個空格。 – Dave

相關問題