可选的第一个匹配正则表达式可以与第二个匹配相同

时间:2013-02-23 22:27:28

标签: ruby regex

我想从字符串的每一行获得3个匹配项:

m&tch1@ match2@  match3canbe&ny7hing
match2@          match3canbe&ny7hing
  • 匹配1可以是任何非空格,它并不总是以@
  • 结尾
  • 如果匹配1存在,则它与匹配2分隔开一个空格(该空格不是匹配的一部分)
  • 匹配2始终是一个正常的单词,始终以@
  • 结尾
  • 第3场比赛是

所以从上面我想要:

Match 1
1.  m&tch1@
2.  match2
3.  match3canbe&ny7hing
Match 2
1.  
2.  match2
3.  match3canbe&ny7hing

我想出了这个:/^(\S*@?) ?(\w+)@ +(.+)/但它返回:

Match 1
1.  m&tch1@
2.  match2
3.  match3canbe&ny7hing
Match 2
1.  match
2.  2
3.  match3canbe&ny7hing

匹配1很好,但是对于第2场比赛,第一组应为空,第二组应为'match2'

如果单靠正则表达式无法完成任何其他建议吗?

UPD: sawa的解决方案有效,但如果我在行前加上任何内容,例如:标签:

prefix m&tch1: match2: match3canbe&ny7hing
prefix match2: match3canbe&ny7hing

并像这样扫描:/^prefix (\S*)\s+(\S*):\s+(\S+)/ 它只扫描一行

目前:http://rubular.com/r/expKw59fF2
使用前缀(尚未使用):http://rubular.com/r/VWGgU1qNWA

1 个答案:

答案 0 :(得分:1)

string.scan(/(\S*)\s+(\S*)@\s+(\S+)/)

返回:

[
  [
    "m&tch1@",
    "match2",
    "match3canbe&ny7hing"
  ],
  [
    "",
    "match2",
    "match3canbe&ny7hing"
  ]
]