2017-12-29 15 views
2

Ich benutze Ruby 2.4. Ich bin total verwirrt darüber, warum meine RegEx nicht funktioniert. Ich möchte ein Token von meinem Array abgleichen, vorausgesetzt, das Zeug direkt bevor es keine Buchstaben ist. Mein Array istWie passe ich Nicht-Buchstaben vor meinem Token an?

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

So sollte diese

"2f 25" 

passen, wie sollte

"f 100" 

aber nicht

"elf 25" 

seit dem Zeug vor dem "f" sind die Buchstaben nicht . Ich dachte, das würde es tun ...

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"> 

Aber es ist immer gleich. Warum passt "^ \ p {L}]" nicht auf Buchstaben?

Antwort

2

Scheint den umgekehrten Schrägstrich, bevor p wegen Anführungszeichen verloren geht.

Ich weiß nicht viel Ruby, aber ich könnte here überprüfen.

+0

'r = Regexp.new (" (^ | [^ \\ p {L}] +) # {Regexp.union (GENDER_TOKENS)} ") # =>/(^ | [^ \ p {L} ] +) (? - mix: m | männlich | men | f | w | weiblich | wom)/'behebt das Problem, das du identifiziert hast, aber die Mängel bleiben bestehen (z. B." 2 freaky 3 ".match? (r) # = > wahr <). –

+0

@CarySwoveland, ich stimme Ihrer Antwort zu, –

3

Ich schlage vor, Sie schreiben Ihre Regex wie folgt.

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

in dem es heißt, „nicht einen Brief (negative Lookbehind) entsprechen, ein Element der GENDER_TOKENS, entsprechen nicht übereinstimmen einen Brief (negative Look-Ahead)“.

"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 

Beachten Sie, dass die negative Vorschau Wenn wir verwenden benötigt. die Regex

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

wir falsche Ergebnisse, wie

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

(weil das Token "f" übereinstimmt).

Verwandte Themen