javascript - 使用匹配每个子字符串的 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
。这些确实是与我的正则表达式匹配的子字符串,但在这种情况下我想得到一个错误,因为字符串包含???
的不是有效的子字符串。
我怎样才能做到这一点?
解决方案
正/\s*(\w+|"[^"]*")\s*/g
则表达式用于从字符串中提取多个模式匹配,而不是用来验证字符串。
如果您需要返回true或false,则需要一个具有以下属性的正则表达式进行验证:
- 验证正则表达式匹配整个字符串
- 验证正则表达式没有
g
标志(如果与 一起使用RegExp#test
,可能会导致不受欢迎的副作用并增加混乱(请参阅为什么带有全局标志的 RegExp 会给出错误的结果?))。
因此,在您的情况下,请使用两步法:
- 先验证字符串
/^\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!")
}
}
推荐阅读
- python - 使用 Python Loop 从 Excel 文件创建多个 .txt 文件
- javascript - 从 URL 的开头和结尾删除斜杠
- android - Android 错误:找不到符号类 DaggerAppComponent
- python-3.x - 可以与整数比较的类
- laravel - 数据未提交到数据库
- automation - 如何在不使用 RQM 和 RQM 适配器的情况下在远程机器上运行 RFT 脚本?
- spring-boot - Spring Boot + Swagger-Ui yml 生成
- git - git add 多次而不提交
- python - 在python中对数据名称进行For循环
- kotlin - Kotlin 中的构造函数与参数