我有正则表达式。
(\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
修饰符。
我如何修改以匹配第一个?
答案 0 :(得分:2)
这与您要做的事情相符
(如果要在下游检查中跨越行,请将.
替换为[\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
输出&gt;&gt;
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)
)