JS正则表达式在分隔符之间执行内部字符串并检查损坏的分隔符

时间:2013-02-01 23:09:04

标签: javascript regex

我在表单中有一个输入字段,我必须检查我们已设置的某个标记。

分隔符为{!}

我想匹配分隔符内的所有内容。

content = /regex/g.exec('{!content}')

输入字符串中可以包含多个标记。

input = '{!content} {!other}';
['content','other'] = /regex/g.exec('{!content} {!other}')

这是问题的第一部分,现在它已经到了有趣的部分。

我也有某些标记分隔符未正确结束的位置,我也必须检查这些分隔符。

在这种情况下,我想得到:

input = '{!content {!other} {!broken';
['{!content', 'other', '{!broken'] = /regex/g.exec(input);

更新 * 发现了@MikeM的原始解决方案未捕获我想要的内容的情况。如果起始分隔符本身,我需要在结果数组中显示它们。如果起始分隔符位于字符串的末尾,则它不会捕获。

input = '{!content {!other} {!';
['{!content', 'other', '{!'] = /regex/g.exec(input);

2 个答案:

答案 0 :(得分:2)

如果内容中不允许{},则可以使用以下内容

var m,    
    result = [],
    str = '{!content {!other} {!broken',
    reg = /\{!([^{}]+)\}|(\{![^{}]+)/g;

while ( m = reg.exec( str ) ) {
    result.push( m[1] || m[2] );
}

console.log( result );   // [ "{!content ", "other", "{!broken" ]

但是,它会在未公开的内容之后抓住空格。

更新

要捕获内容而不包括任何前导或尾随空格,您可以使用以下内容 - 为了清晰起见,请使用更长的形式。

var m,    
    result = [],
    str = '{!content {!other} {!broken  {!    broken {! content }',
    reg = /\{!\s*([^{}]+?)\s*\}|\{!\s*([^{}]+?)\s*(?=\{|$)/g;

m = reg.exec( str );

while ( m != null ) {   

    if ( m[1] != null ) {
        result.push( m[1] );
    } else {  // m[2] cannot be null
        result.push( '{!' + m[2] );
    }
    m = reg.exec( str );
}

console.log( result );   
// [ "{!content", "other", "{!broken", "content", "{!broken", "content" ]

有关exec的更多信息,请参阅MDN exec

答案 1 :(得分:0)

返回匹配数组:

(str.match(/\{\!.*?.(?=[\{\}])|\{\!.+?$/g)||[]).map(function(m){return m.substring(2);});
  • (_.match(...)||[])是一个成语。如果找不到匹配项,则匹配返回null,但通常更方便获取空数组。 ||[]解决了这个问题。
  • 正则表达式以非贪婪的方式查找{!和终结符之间的匹配项。也就是说,它正在寻找}之后可以找到的第一个{!。我们还必须容忍遇到不匹配的开括号{和行的结尾,并将它们作为可能的匹配传递。

    enter image description here

  • 上述匹配始终以{!开头,但没有终止分隔符。剩下要做的唯一事情是剥离它,所以我们可以map数组substring(2)。如果你想要摆脱前后的空白,你可以制作这个substring(2).trim()