1

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

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

我正在使用以下正则表达式来获取

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 安全字符的所有内容。

我确信有一个完全有效的解释,但它让我望而却步。有任何想法吗?谢谢!

4

2 回答 2

2

其实想一想,光用[^\]]可能还不够,还会把所有的空间都吞掉。您还需要排除这些:

/\[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

但这绝对是品味问题。

于 2013-04-18T21:55:13.653 回答
1

问题在于\S+贪婪

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

你可以试试:

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

但实际上你的新角色类是 IMO 上级。

更好的可能是:

/\[CODE ([^\]]+?)\s?([^\]]*)\]/i
于 2013-04-18T21:50:14.500 回答