0

我不确定标题是否准确,所以如果这是重复的,我很抱歉。

据我了解,(a|b)匹配ab。这可以扩展,例如([\w]|@)匹配单词字符或@.

我的问题是:为什么这不适用于量词?我正在尝试匹配量化字符集或单个@,但([\w\.\-]*|@)不会匹配@

谁能解释这种行为的原因,也许是正确的方法?

4

2 回答 2

3

*意思是“匹配零个或多个”。因此,您的模式的第一部分可以成功匹配任何内容(空字符串)。第一部分总是成功的,所以它从不尝试第二部分。

你有两个选择来解决这个问题:

  1. 用于+要求至少一个字符:([\w\.\-]+|@)
  2. 放第@一个:(@|[\w\.\-]*)。如果您仍然想要匹配一个空字符串,但@如果它存在,您想要匹配它,这很有用。

更新: Linuxios 建议 Ruby 不允许*在子模式中使用。我不是 Ruby 用户,但如果这是真的,你可以像这样得到选项 2 的等价物:

(@|[\w\.\-]+)?
于 2013-02-20T14:36:40.910 回答
1

Ruby 不允许在 or 中使用可以匹配nothing的变量量词,因为没有什么总是匹配的,这使得 or 毫无意义。

于 2013-02-20T14:36:41.173 回答