我不确定标题是否准确,所以如果这是重复的,我很抱歉。
据我了解,(a|b)
匹配a
或b
。这可以扩展,例如([\w]|@)
匹配单词字符或@
.
我的问题是:为什么这不适用于量词?我正在尝试匹配量化字符集或单个@
,但([\w\.\-]*|@)
不会匹配@
。
谁能解释这种行为的原因,也许是正确的方法?
*
意思是“匹配零个或多个”。因此,您的模式的第一部分可以成功匹配任何内容(空字符串)。第一部分总是成功的,所以它从不尝试第二部分。
你有两个选择来解决这个问题:
+
要求至少一个字符:([\w\.\-]+|@)
@
一个:(@|[\w\.\-]*)
。如果您仍然想要匹配一个空字符串,但@
如果它存在,您想要匹配它,这很有用。更新: Linuxios 建议 Ruby 不允许*
在子模式中使用。我不是 Ruby 用户,但如果这是真的,你可以像这样得到选项 2 的等价物:
(@|[\w\.\-]+)?
Ruby 不允许在 or 中使用可以匹配nothing的变量量词,因为没有什么总是匹配的,这使得 or 毫无意义。