捕获量化字符集或单个字符

时间:2013-02-20 14:32:09

标签: ruby regex

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

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

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

任何人都可以解释这种行为的原因,也许是正确的方法吗?

2 个答案:

答案 0 :(得分:3)

*表示“匹配零或更多”。因此,模式的第一部分可以成功匹配任何内容(空字符串)。第一部分总是成功的,所以它永远不会尝试第二部分。

您有两种方法可以解决此问题:

  1. 使用+至少需要一个字符:([\w\.\-]+|@)
  2. 先放置@(@|[\w\.\-]*)。如果您仍然希望匹配空字符串,但是如果它匹配@,则此功能非常有用。
  3. 更新: Linuxios建议Ruby不允许在子模式中使用*。我不是Ruby用户,但如果这是真的,你可以得到相当于选项2的内容:

    (@|[\w\.\-]+)?
    

答案 1 :(得分:1)

Ruby不允许使用变量量词,或者可以匹配 nothing ,因为没有什么总是匹配,从而产生或无意义。