我正在 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
请注意 [ ]
- 我只是认为它使文字空间更具可读性。
以自由间距模式解释:
\[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/