【发布时间】:2021-11-22 11:27:38
【问题描述】:
我需要拆分一个字符串。我有一个能够完全匹配每个子字符串的正则表达式。
我尝试将它与 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。这些确实是与我的正则表达式匹配的子字符串,但在这种情况下我会想得到一个错误,因为字符串包含 ??? 这不是一个有效的子字符串。
我该怎么做?
【问题讨论】:
-
如果您接受
*,空格对匹配是否重要?匹配不会引发错误,它会找到所有出现的分组。如果您想通过正则表达式验证您的字符串,您可能正在寻找re.test(str) -
@asyncawait:分隔两个标记的空格是可选的。我并不真正关心匹配那些(实际上不捕获它们),但正则表达式包含它们,因为它旨在完全按顺序步骤匹配整个字符串,而不跳过任何字符。我不确定在这种情况下如何使用
re.test(str)...除非您建议构建一个与给定N次匹配的新正则表达式(例如/^(\s*(\w+|"[^"]*")\s*)*$/)...看起来有点构建这样的正则表达式很痛苦,所以我想知道是否存在其他解决方案? -
问题在于测试,如果任何字符串通过,它就会通过。您可以将
.replace(与正则表达式、全局标志一起使用,并替换为空字符串。那么如果它仍然有长度,你就知道你有无效字符。如果它是一个大字符串,您可以为无效字符构建一个表达式并对其进行测试。 -
我不能轻易地为无效字符创建正则表达式:在实际情况下,它不仅仅是关于字符,还涉及到一些上下文;我可以使用匹配的正则表达式来处理它,但不能使用“无效匹配”的。用空字符串替换与我的令牌匹配的所有内容并检查最终长度的想法是一个很好的想法。如果没有更好的办法,我会去的
-
const isValid = (str.match(re).length === str.split(re).filter(s => s !== '').length)
标签: javascript regex string split