模式匹配超出预期。如果有人可以解释为什么“地址”是后视的一部分时匹配,以及如何防止这种情况。提前感谢您对此的任何帮助。
图案:
(?<=@address|)[a-zA-Z]+(?=[^\]\[]*\])
细绳:
test [@address|singleline second] test
结果:
address singleline second
模式匹配超出预期。如果有人可以解释为什么“地址”是后视的一部分时匹配,以及如何防止这种情况。提前感谢您对此的任何帮助。
图案:
(?<=@address|)[a-zA-Z]+(?=[^\]\[]*\])
细绳:
test [@address|singleline second] test
结果:
address singleline second
你需要逃避|
:
(?<=@address\|)[a-zA-Z]+(?=[^\]\[]*\])
因为(?<=@address|)
断言匹配的字符串前面是@address
空字符串或空字符串。(并且由于所有内容都始终以空字符串开头,因此无效。)
顺便说一句,一个小术语说明:(?<=@address|)
叫做向后看,而不是向前看。前瞻断言,例如 your ,(?=[^\]\[]*\])
断言正则表达式中的给定点是(或不是)后跟指定模式。
环顾四周甚至没有必要。
您似乎希望结果为“单行”。(你的标记 a-zA-Z 只是字母,内部数据是空格分隔的,整个模式就是这样。)
及地址| 是静态的。
那么,为什么不少环顾四周,而只是消耗:
/@address\|(\w+).*?\]/g //$1 has the capture.
除了更简单之外,一个可能的好处是:如果您必须在大量数据上全局运行它,那么您将匹配到 last ]
,而不是只匹配到e
in 'singleline'。