匹配不止一次

时间:2014-03-19 16:41:13

标签: javascript regex

我有正则表达式。

(\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修饰符。

我如何修改以匹配第一个?

1 个答案:

答案 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)
 )