gpt4 book ai didi

ruby - 将正则表达式插入另一个正则表达式

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

在下面的代码中,k2k1 的差别很小。也就是说,k2 完全相同,只是它是使用插值定义的。 (也就是说,我期望它是完全一样的;显然从 p k2 的结果来看它不是。)

v  = /[aeiouAEIOUäöüÄÖÜ]/                 # vowels
k1 = /[[ßb-zB-Z]&&[^[aeiouAEIOUäöüÄÖÜ]]]/ # consonants defined without interpolation
k2 = /[[ßb-zB-Z]&&[^#{v}]]/               # consonants defined same way, but with interpolation

但如下所示,将 gsubk1 一起使用是可行的,而将其与 k2 一起使用会以我不理解的方式失败。

all_chars = "äöüÄÖÜß"<<('a'..'z').to_a.join<<('A'..'Z').to_a.join

p all_chars                  # "äöüÄÖÜßabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
p all_chars.gsub( k1 , '_' ) # "äöüÄÖÜ_a___e___i_____o_____u_____A___E___I_____O_____U_____"
p all_chars.gsub( k2 , '_' ) # "äöüÄÖÜ_abcdefghijklm_o_____u__x__ABCDEFGHIJKLMNOPQRSTUVWXYZ"
p k1                         # /[[ßb-zB-Z]&&[^[aeiouAEIOUäöüÄÖÜ]]]/
p k2                         # /[[ßb-zB-Z]&&[^(?-mix:[aeiouAEIOUäöüÄÖÜ])]]/

为什么不起作用?什么是 (?-mix:...)?有没有办法让这项工作按我预期的方式进行?

最佳答案

我会做这样的事情:

keywords = %w[foo bar]
regex = /\b(?:#{ Regexp.union(keywords).source })\b/i
# => /\b(?:foo|bar)\b/i

当您想一次测试单个字符串中是否出现多个子字符串时,这很有用。

将正则表达式插入字符串不一定能正常工作。默认情况下,当您这样做时,Ruby 使用 to_s 转换模式,这不是我想要的,因为我不想要模式、标志和所有内容的完整字符串表示。使用source返回我想要的:

regex = Regexp.union(keywords)
regex # => /foo|bar/
regex.inspect # => "/foo|bar/"
regex.to_s # => "(?-mix:foo|bar)"
regex.source # => "foo|bar"

关于ruby - 将正则表达式插入另一个正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704698/

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