2016-10-12 2 views
0

레일 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은 공백이 아닌 길이가 0 인 단어 경계와 일치합니다. 당신은 더 이런 식으로 뭔가를 찾고 :

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

이의 모든 문자 (.)와 일치합니다 first 사이 second만큼 양쪽에 단어 경계가있다. (당신이 스스로 경계 단어와 일치하는 길이 제로의 수표를 사용할 필요가 없기 때문에)


그러나,이 단어 경계가 일반적으로 사용되는 방법이 아닙니다. \b은 본질적으로 단어 문자 뒤에 단어가 아닌 문자를 찾고 있습니다. 그래서 대신에, 당신은 단지 secondfirst에서 ts 사이 - 비 단어 문자를 찾을 수 :

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

이것은 당신이 현실적으로 정확하게 첫 번째 예와 동일하다 ...하지만 아마 공백을 일치 시키려면이 같은 것을 사용할 수 있습니다 WiktorStribiżew의 세 번째 예 @

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

은 (시작과 끝) 단어 경계의 최고 사용하는 방법을 보여줍니다. 이는 전후에 어떤 것도 일치시키지 않아서 길이가 0 인 테스트가 도움이되기 때문입니다. 그렇지 않으면 위의 예는 first secondary과 일치 할 수 있습니다.

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

또는'/ first \ ssecond /'또는'/ first second /'또는'/ \ bfirst second \ b /' –

+0

고맙습니다. @ WiktorStribiżew, 저는 왜 당신이 보통 길이가 0 인 이런 상황에서 일치해라. – Sam

+0

감사하지만 주어진 단어 사이에 둘 이상의 공백이있는 경우 /first\Wsecond/.match('first second ')의 경우 주어진 답은 실패합니다. – Dave