gpt4 book ai didi

ruby - 如何使用 Regexp.union 匹配字符串开头的字符

转载 作者:太空宇宙 更新时间:2023-11-03 17:44:28 25 4
gpt4 key购买 nike

我正在使用 Ruby 2.4。我想匹配一个可选的“a”或“b”字符,后跟任意数量的空格,然后是一个或多个数字,但我的正则表达式无法匹配以下任何一个:

2.4.0 :017 > MY_TOKENS = ["a", "b"]
=> ["a", "b"]
2.4.0 :018 > str = "40"
=> "40"
2.4.0 :019 > str =~ Regexp.new("^[#{Regexp.union(MY_TOKENS)}]?[[:space:]]*\d+[^a-z^0-9]*$")
=> nil
2.4.0 :020 > str =~ Regexp.new("^#{Regexp.union(MY_TOKENS)}?[[:space:]]*\d+[^a-z^0-9]*$")
=> nil
2.4.0 :021 > str =~ Regexp.new("^#{Regexp.union(MY_TOKENS)}?[[:space:]]*\d+$")
=> nil

我对自己做错了什么感到难过。

最佳答案

如果它们是单个字符,只需在字符类中使用 MY_TOKENS.join:

MY_TOKENS = ["a", "b"]
str = "40"
first_regex = /^[#{MY_TOKENS.join}]?[[:space:]]*\d+[^a-z0-9]*$/
# /^[ab]?[[:space:]]*\d+[^a-z0-9]*$/
puts str =~ first_regex
# 0

您还可以集成 Regexp.union,它可能会导致 some unexpected bugs不过,因为外部正则表达式的标志不适用于内部正则表达式:

second_regex = /^#{Regexp.union(MY_TOKENS)}?[[:space:]]*\d+[^a-z0-9]*$/
# /^(?-mix:a|b)?[[:space:]]*\d+[^a-z0-9]*$/
puts str =~ second_regex
# 0

上面的正则表达式看起来很像你所做的,但是使用 // 而不是 Regexp.new 可以防止你不得不转义反斜杠。

您可以使用 Regexp#source 来避免这种行为:

third_regex = /^(?:#{Regexp.union(MY_TOKENS).source})?[[:space:]]*\d+[^a-z0-9]*$/
# /^(?:a|b)?[[:space:]]*\d+[^a-z0-9]*$/
puts str =~ third_regex
# 0

或者简单地构建您的正则表达式联合:

fourth_regex = /^(?:#{MY_TOKENS.join('|')})?[[:space:]]*\d+[^a-z0-9]*$/
# /^(?:a|b)?[[:space:]]*\d+[^a-z0-9]*$/
puts str =~ fourth_regex
# 0

如果 MY_TOKENS 包含单词而不仅仅是字符,则最后 3 个示例应该可以正常工作。

first_regexthird_regexfourth_regex 应该都可以在 /i 标志下正常工作。

举个例子:

first_regex = /^[#{MY_TOKENS.join}]?[[:space:]]*\d+[^a-z0-9]*$/i
"A 40" =~ first_regex
# 0

关于ruby - 如何使用 Regexp.union 匹配字符串开头的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054542/

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