2017-12-29 3 views
2

Ruby 2.4를 사용하고 있습니다. RegEx가 작동하지 않는 이유에 대해 대단히 혼란 스럽습니다. 글자가 아닌 바로 전에 배열을 토큰과 일치시키고 싶습니다. 내 배열 그래서이 일치해야내 토큰 앞에 문자가 아닌 문자는 어떻게 매치합니까?

2.4.0 :023 > GENDER_TOKENS 
=> ["m", "male", "men", "f", "w", "female", "wom"] 

입니다

"2f 25" 

"f 100" 

그러나 "F"전에 물건부터하지

"elf 25" 

는 문자가없는해야으로 . 나는 이것이 그것을 할 것이라고 생각했다. ...

2.4.0 :021 > data = "elf 25" 
=> "elf 25" 
2.4.0 :022 > Regexp.new("(^|[^\p{L}]+)#{Regexp.union(GENDER_TOKENS)}").match(data.downcase) 
=> #<MatchData "elf" 1:"el"> 

그러나 그것은 모두 같은 것이다. 왜 "^ \ p {L}]"이 (가) 비 문자와 일치하지 않습니까?

답변

2

큰 따옴표로 인해 p가 손실되기 전에 백 슬래시로 보입니다.

루비에 대해 잘 모르지만 here을 확인할 수 있습니다.

+0

'r = Regexp.new ("(^ | [^ \ p {L}] +) # {Regexp.union (GENDER_TOKENS)}") # =>/(^ | [^ \ p {L} ] +) (? - mix : m | male | men | f | w | female | wom) /'당신이 확인한 문제는 해결하지만 단점은 남아 있습니다 (예 :''2 freaky 3 ')? > 참'). –

+0

@CarySwoveland, 귀하의 답변에 동의합니다. –

3

다음과 같이 정규식을 작성하는 것이 좋습니다. 읽기

r = /(?<!\p{L})#{Regexp.union(GENDER_TOKENS)}(?!\p{L})/ 
    #=> /(?<!\p{L})(?-mix:m|male|men|f|w|female|wom)(?!\p{L})/ 

. "편지 (부정 lookbehind)와 일치하지 않는 편지 (부정적 예측을) 일치하지 않는, GENDER_TOKENS의 요소를 일치"

"2f 25".match?(r)  #=> true 
"2f25".match?(r)  #=> true 
"2female".match?(r) #=> true 
"male 100".match?(r) #=> true 
"elf 25".match?(r)  #=> false 
"2funky 25".match?(r) #=> false 

참고 부정적 예측이 그 필요하다. 우리는

,369 등 우리가 잘못된 결과를 얻을 수 있습니다

rr = /(?<!\p{L})#{Regexp.union(GENDER_TOKENS)}/ 
    #=> /(?<!\p{L})(?-mix:m|male|men|f|w|female|wom)/ 

정규식을 사용하는 경우

"2funky 25".match?(rr) #=> true 

(토큰 "f"이 일치하므로).

관련 문제