gpt4 book ai didi

ruby - 替换非单词字符,除非给定的序列匹配

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

我有这样一个字符串:

"Jim-Bob's email @@@hl@@@address@@@endhl@@@ is: jb@example.com"

我想替换所有非单词字符(符号和空格),@@@ 分隔符除外。

我目前正在使用:

str.gsub(/[^\w@]+/, 'X')

产生:

"JimXBobXsXemailX@@@hl@@@address@@@endhl@@@XisXjb@exampleXcom"

在实践中,这已经足够好了,但它冒犯了我,原因有二:

  • 电子邮件地址中的@不被替换。
  • 使用 [^\w] 而不是 \W 感觉很草率。

如何替换所有非单词字符,除非这些字符构成 @@@hl@@@@@@endhl@@@ 分隔符字符串?

最佳答案

str.gsub(/(@@@.*?@@@|\w+)|./) { $1 || "X" }
# => "JimXBobXsXemailX@@@hl@@@address@@@endhl@@@XisXXjbXexampleXcom"

这种方法利用了这样一个事实,即交替像 case 结构一样工作:第一个匹配的使用相应的字符串,然后不再对其进行进一步的匹配。因此,@@@.*?@@@ 将消耗一个标记(如 @@@hl@@@;其中不会匹配任何其他内容。我们也匹配任何单词字符序列。如果其中任何一个被捕获,我们可以按原样返回它们($1)。如果没有,那么我们匹配任何其他字符(即不在标记内,并且不单词字符)并将其替换为 "X"

关于ruby - 替换非单词字符,除非给定的序列匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130935/

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