我有一个正则表达式。
(\w+(?==\w+)|(?!==\w+)\w+)(?!\{\{)(?!.*token)(?=.*}})
测试字符串:
some text {{token id=foo1 class=foo2 attr1=foo3 hi=we}} more text {{token abc=xyz}} final text
但是,这仅匹配 {{token abc=xyz}}
而不是 {{token id=fool class=foo2 attr1=foo3 hi=we}}
我已经使用过g
修饰符。
如何修改以匹配第一个?
最佳答案
这符合您想要做的事情
(如果您想在下游检查上跨行,请将 .
替换为 [\S\s]
)
第一个解决方案无法验证{{token
存在
# /(?:(\w+)=(\w+))(?=(?:(?!{{token[ ]|}}).)*}})/
(?: # Next key,val pair
( \w+ ) # (1)
=
( \w+ ) # (2)
)
(?= # Downstream, must be a }}
(?:
(?! {{ token [ ] | }} )
.
)*
}}
)
Perl 测试用例
$/ = undef;
$str = <DATA>;
while ( $str =~ /(?:(\w+)=(\w+))(?=(?:(?!{{token[ ]|}}).)*}})/g )
{
print "$1 = $2\n";
}
__DATA__
some text {{token id=foo1 class=foo2 attr1=foo3 hi=we}} more text {{token abc=xyz}} final text
输出>>
id = foo1
class = foo2
attr1 = foo3
hi = we
abc = xyz
<小时/>
此解决方案使用两个正则表达式。一个用于获取 {{token .. }}
,一个用于解析 key
=value
# Regex 1
{{ token \b
(?:
(?! {{ | }} )
.
)+
}}
# Regex 2
(?: # Next key,val pair
( \w+ ) # (1)
=
( \w+ ) # (2)
)
关于javascript - 匹配多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512544/