我不确定标题是否准确,所以如果这是重复的话,我很抱歉。
根据我的理解,(a|b)
匹配a
或b
。这可以扩展,例如([\w]|@)
以匹配单词字符或@
。
我的问题是:为什么这不适用于量词?我正在尝试匹配量化字符集或单个@
,但([\w\.\-]*|@)
与@
不匹配。
任何人都可以解释这种行为的原因,也许是正确的方法吗?
答案 0 :(得分:3)
*
表示“匹配零或更多”。因此,模式的第一部分可以成功匹配任何内容(空字符串)。第一部分总是成功的,所以它永远不会尝试第二部分。
您有两种方法可以解决此问题:
+
至少需要一个字符:([\w\.\-]+|@)
@
:(@|[\w\.\-]*)
。如果您仍然希望匹配空字符串,但是如果它匹配@
,则此功能非常有用。 更新: Linuxios建议Ruby不允许在子模式中使用*
。我不是Ruby用户,但如果这是真的,你可以得到相当于选项2的内容:
(@|[\w\.\-]+)?
答案 1 :(得分:1)
Ruby不允许使用变量量词,或者可以匹配 nothing ,因为没有什么总是匹配,从而产生或无意义。