gpt4 book ai didi

arrays - 如何匹配 token 前的非字母?

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:56 25 4
gpt4 key购买 nike

我正在使用 Ruby 2.4。我对为什么我的 RegEx 不起作用感到非常困惑。我想匹配我数组中的一个标记,前提是它不是字母之前的东西。我的数组是

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

所以这应该匹配

"2f 25"

应该

"f 100"

但不是

"elf 25"

因为“f”之前的东西不是字母。我以为这样就可以了...

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}]"不匹配非字母?

最佳答案

我建议您按如下方式编写正则表达式。

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

内容为“不匹配一个字母(负向后视),匹配 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

请注意,负前瞻是必需的。如果我们使用正则表达式

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

我们可以获得错误的结果,比如

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

(因为 token "f" 匹配)。

关于arrays - 如何匹配 token 前的非字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48028670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com