Ruby 正则表达式对背靠背匹配过于贪婪

标签 ruby regex

我正在 Ruby 1.8.7 中进行一些文本处理,以支持我创建的一些自定义简码。以下是我的短代码的一些示例:

[CODE first-part]
[CODE first-part second-part]

我正在使用以下 RegEx 来获取

text.gsub!( /\[CODE (\S+)\s?(\S?)\]/i, replacementText )

问题是:正则表达式不适用于以下文本:

[CODE first-part][CODE first-part-again]

结果如下:

1.  first-part][CODE
2.  first-part-again

\s? 似乎是正则表达式中有问题的部分,它一直在搜索直到找到最后一个空格,而不是第一个空格。当我将正则表达式更改为以下内容时:

\[CODE ([\w-]+)\s?(\S*)\]/i

它工作正常。我唯一关心的是所有 \w\s 的区别,因为我想确保 \w 将匹配 URL 安全字符。

我确信有一个完全有效的解释,但它让我难以理解。有任何想法吗?谢谢!

最佳答案

其实想想,只用[^\]]可能还不够,因为它也会把所有的空格都吞掉。您还需要排除那些:

/\[CODE[ ]([^\]\s]+)\s?([^\]\s]*)\]/i

请注意 [ ] - 我只是认为它使文字空间更具可读性。

Working demo.

以自由间距模式解释:

\[CODE[ ]    # match your identifier   
(            # capturing group 1 
  [^\]\s]+   # match one or more non-], non-whitespace characters
)            # end of group 1
\s?          # match an optional whitespace character
(            # capturing group 2 
  [^\]\s]+   # match zero or more non-], non-whitespace characters
)            # end of group 2
\]           # match the closing ]

由于模式中的所有字符类都不包含 ],因此您永远不可能超出方括号表达式的末尾。

顺便说一句,如果你发现正则表达式中不必要的转义像我一样模糊不清,这里是最小版本:

/\[CODE[ ]([^]\s]+)\s?([^]\s]*)]/i

但这绝对是一个品味问题。

关于Ruby 正则表达式对背靠背匹配过于贪婪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093600/

相关文章:

python - 如何使用正则表达式在单词组合之后和下一个空格之前找到具有单词和非单词字符的模式

javascript - 从 Ruby 部分设置 javascript 变量

python - 优雅的结构化文本文件解析

ruby-on-rails - Facebook 开放图谱抓取

mysql - Ruby 脚本无法使用 mysql2 gem 连接到 MySQL 数据库

javascript - 正则表达式关键字过滤

regex - 用于验证给定输入的正则表达式,该输入接受一个空格或连字符,它是文本长度的一部分,它具有最小和最大长度

ruby-on-rails - 功能测试和嵌套资源

javascript - 如何检测正则表达式中的下划线?

regex - 回复 grep : Match one string against multiple patterns