首页 > 解决方案 > 使用匹配每个子字符串的 RegExp 拆分字符串。整个字符串应该完全匹配

问题描述

我需要拆分一个字符串。我有一个能够完全匹配每个子字符串的正则表达式。

我尝试使用它String.prototype.matchAll()并且它能够 split ,但该函数也接受“无效标记”:与我的正则表达式不匹配的字符串片段。例如:

var re = /\s*(\w+|"[^"]*")\s*/g  // matches a word or a quoted string
var str = 'hey ??? "a"b'         // the '???' part is not a valid token
var match = str.matchAll(re)
for(var m of match){
  console.log("Matched:", m[1])
}

给我令牌hey"a"b。这些确实是与我的正则表达式匹配的子字符串,但在这种情况下我想得到一个错误,因为字符串包含???的不是有效的子字符串。

我怎样才能做到这一点?

标签: javascriptregexstringsplit

解决方案


/\s*(\w+|"[^"]*")\s*/g则表达式用于从字符串中提取多个模式匹配,而不是用来验证字符串。

如果您需要返回truefalse,则需要一个具有以下属性的正则表达式进行验证:

因此,在您的情况下,请使用两步法:

  • 先验证字符串/^\s*(?:(?:\w+|"[^"]*")\s*)*$/.test(text)然后再验证
  • 如果有匹配项,请使用您的代码或更增强的代码提取匹配项,const matches = text.match(/\w+|"[^"]*"/g).

请参阅 JavaScript 演示:

var extraction_re = /\w+|"[^"]*"/g;
var validation_re = /^\s*(?:(?:\w+|"[^"]*")\s*)*$/;
for (var text of ['hey "a"b', 'hey ??? "a"b']) {
    if (validation_re.test(text)) {
        console.log("Matched:", text.match(extraction_re))
    } else {
        console.log(text, "=> No Match!")
    }
}


推荐阅读