gpt4 book ai didi

ruby-on-rails - 为什么正则表达式不能匹配 @ 符号?

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

对于字符串Be there @ six.

为什么这样做:

str.gsub! /\bsix\b/i, "seven"

但是试图替换@符号不匹配:

str.gsub! /\b@\b/i, "at"

转义它似乎也不起作用:

str.gsub! /\b\@\b/i, "at"

最佳答案

这取决于 \b 的解释方式。 \b 是一个“单词边界”,其中如果 \b 前面或后面有一个单词字符,则会发生零长度匹配。单词字符仅限于 [A-Za-z0-9_] 和其他一些东西,但是 @ 不是单词字符,所以 \b 不会匹配它之前(和空格之后)。空间本身不是边界。

More about word boundaries...

如果您需要将 @ 替换为周围的空格,您可以在 \b 之后捕获它并使用反向引用。对于 零个或多个 空格字符,这会使用 \s* 捕获前面的空格。

str.gsub! /\b(\s*)@(\s*)\b/i, "\\1at\\2"
=> "Be there at six"

或者要坚持使用空格,请使用 \s+ 而不是 \s*

str = "Be there @ six."
str.gsub! /\b(\s+)@(\s+)\b/i, "\\1at\\2"
=> "Be there at six."

# No match without whitespace...
str = "Be there@six."
str.gsub! /\b(\s+)@(\s+)\b/i, "\\1at\\2"
=> nil

此时,我们开始通过强制使用 \b 来引入冗余。它可以通过 /(\w+\s+)@(\s+\w+)/ 轻松完成,前面的 \b 匹配 \w 单词字符后跟 \s 空格。

评论后更新:

如果你想把 @ 当作一个可能出现在开头或结尾的“单词”,或者内部以空格为界,你可以使用 \W 来匹配“非单词”字符,结合 ^$ anchor 和“或”管道 |:

# Replace @ at the start, middle, before punctuation
str = "@ Be there @ six @."
str.gsub! /(^|\W+)@(\W+|$)/, '\\1at\\2'
=> "at Be there at six at."

(^|\W+) 匹配 ^ 字符串的开头,或一系列非单词字符(如空格或标点符号)。 (\W+|$)类似但是可以匹配字符串的结尾$

关于ruby-on-rails - 为什么正则表达式不能匹配 @ 符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22951220/

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