字符串示例:文本示例 [79zd915j][fxC1bPYW][asd12233]
结果我想要一个数组:[[79bl9F5j]", "[fKCebPYW]", "[asd12233]"]
我提出了解决方案,但不知何故 in 并没有在括号内的 8 个符号后停止并转到字符串的末尾。
我的正则表达式:/(\[[\w\d]{8}\])+/.exec("Text sample [79bl9F5j][fKCebPYW][asd12233]")
我的结果:[[79bl9F5j][fKCebPYW][asd12233]", "[asd12233]"]
帮我写一个正确的,请告诉我我的正则表达式有什么问题?为什么它不像我预期的那样工作?
最佳答案
TL;DR → 使用 String.match()
而不是 RegExp.exec()
你的模式 /(\[[\w\d]{8}\])+/
可以先简化,因为预定义的 \w
是[A-Za-z0-9_]
并且已经包含 \d
中的所有内容 - 所以我们简化为 /(\[\w{8)\] )+/
您使用 +
意味着匹配一个或多个,所以这意味着匹配 [12345678]
多次,并返回 that,这就是为什么你得到 [79bl9F5j][fKCebPYW][asd12233]"
作为你的第一个结果。
.exec()
方法返回一个数组,其中包含作为 result[0]
的整个匹配项,后跟后续数组元素中的每个捕获组。请参阅 the MDN doc 执行。
因此,您的第二个数组元素是捕获的组,而不是重复匹配项。
您需要一个全局 匹配,因为您想要找到 所有 [12345678]
出现的地方,所以消除 +
并添加 g
开关,它现在给出 /(\[\w{8)\])/g
让我们将它分配给一个 var,这样我们就不必不断地重新输入它:
> var re =/(\[\w{8)\])/g;
.exec()
在您运行时为您提供第一个 匹配项:
> re.exec("Text sample [79bl9F5j][fKCebPYW][asd12233]");
["[79bl9F5j]", "[79bl9F5j]"]
但是对于全局匹配,您可以再次(再一次)运行它
> re.exec("Text sample [79bl9F5j][fKCebPYW][asd12233]");
["[fKCebPYW]", "[fKCebPYW]"]
这次它返回了第二个匹配项。但它每个返回两次......那是因为捕获组。让我们放弃那部分并重新定义我们的 re 然后运行 .exec...
> var re = /\[\w{8}\]/g;
undefined
> re.exec("Text sample [79bl9F5j][fKCebPYW][asd12233]");
["[79bl9F5j]"]
> re.exec("Text sample [79bl9F5j][fKCebPYW][asd12233]");
["[fKCebPYW]"]
> re.exec("Text sample [79bl9F5j][fKCebPYW][asd12233]");
["[asd12233]"]
因此,您可以通过在循环中运行 .exec()
来获取所有匹配项,在同一字符串上重复使用正则表达式,因为 regexp 对象会记住上下文。
但是它比那容易得多——因为您可以使用 String.match(regexp)
而不是使用 RegExp.exec()
,它返回“包含整个匹配结果的数组...”
> var re = /\[\w{8}\]/g;
undefined
> "Text sample [79bl9F5j][fKCebPYW][asd12233]".match(re);
["[79bl9F5j]", "[fKCebPYW]", "[asd12233]"]
> "Text sample [79bl9F5j] x [fKCebPYW][asd12233] [1234efgh]".match(re);
["[79bl9F5j]", "[fKCebPYW]", "[asd12233]", "[1234efgh]"]
关于javascript - 正则表达式:方括号之间的有限符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40251369/