我在表单中有一个输入字段,我必须检查我们已设置的某个标记。
分隔符为{!
,}
。
我想匹配分隔符内的所有内容。
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);
答案 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
,但通常更方便获取空数组。 ||[]
解决了这个问题。正则表达式以非贪婪的方式查找{!
和终结符之间的匹配项。也就是说,它正在寻找}
之后可以找到的第一个{!
。我们还必须容忍遇到不匹配的开括号{
和行的结尾,并将它们作为可能的匹配传递。
{!
开头,但没有终止分隔符。剩下要做的唯一事情是剥离它,所以我们可以map
数组substring(2)
。如果你想要摆脱前后的空白,你可以制作这个substring(2).trim()
。