0

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

分隔符是{!, }

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

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);
4

2 回答 2

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 执行

于 2013-02-01T23:55:21.603 回答
0

返回匹配数组:

(str.match(/\{\!.*?.(?=[\{\}])|\{\!.+?$/g)||[]).map(function(m){return m.substring(2);});
  • (_.match(...)||[])是成语。如果没有找到匹配项,则Match 返回null,但通常更方便的是获取一个空数组。||[]解决这个问题。

  • 正则表达式{!以非贪婪的方式查找和终止符之间的匹配。也就是说,它正在}寻找在{!. 我们还必须容忍遇到不匹配的左大括号{和行尾,并尽可能匹配地传递这些内容。

    在此处输入图像描述

  • 上面的匹配总是以{!但没有终止分隔符开始。剩下要做的就是将其剥离,这样我们就可以map将数组转换为substring(2). 如果你想在前后去掉空格,你可以做这个substring(2).trim().

于 2013-02-01T23:11:44.050 回答