javascript - 正则表达式:方括号之间的有限符号

标签 javascript regex

字符串示例:文本示例 [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/

相关文章:

regex - 模式验证器对于 IP 地址正则表达式无效

java - 正则表达式与java

java - 无法弄清楚我的 DocumentFilter 出了什么问题

javascript - 将文本字段限制为仅数字的最佳方法?

javascript - 使用函数中的变量删除对象的键和值

javascript - AngularJS $scope 没有观察来自 View 的变化

javascript - 无法打开模态窗口

javascript - backbone.js - Collection View 给出 "TypeError: Cannot read property ' el' 的未定义“错误

html - Perl:HTTP::微小删除留下损坏的 anchor 标记

正则表达式帮助不以 -0 或 -00 结尾