匹配具有不同的前面零宽度模式的相同字符串

时间:2018-04-27 08:13:10

标签: vim

我想找到 foo bar 的以下匹配项,电子邮件的接收方为username。那就是:

username:"foo",web:"foo.com",email:"foo@foo.com"

- >匹配用户名和电子邮件中的 foo ,而不是网络

username:"bar",web:"bar.com",email:"bar@bar.com"

- >匹配用户名和电子邮件中的,而不是网络

username:"vi",web:"vi.com",email:"vim@vi.com"

- >没有比赛

以下是我尝试的失败表达式:

\(username:"\)\@<=[^"]\+\(".*email:"\)\@<=\1@

导致不匹配。
有没有可能找到这些匹配?

2 个答案:

答案 0 :(得分:2)

你几乎拥有它。您需要在用户名部分周围添加括号,然后使用\2而不是\1

\(username:"\)\@<=\([^"]\+\)\(.*email:"\2@\)\@=

如果您只想匹配行而不是提取用户名,则可以简化为

username:"\([^"]*\).*email:"\1@

答案 1 :(得分:0)

通过您的示例,此行应该有所帮助:

\v(web:"[^"]{-})@<!(foo|bar)

enter image description here