Javascript正则表达式捕获组无法正常工作

时间:2015-10-20 12:40:38

标签: javascript regex

我正在尝试捕获1或2条信息。当使用regexr时,它显示我的表达式正在工作并捕获它应该如此,但在运行它时,它只捕获单个字符串(与regexr中的数据相同)并返回null以用于其余部分。

我尝试过构建表达式 here

当切换到JS风格时,它会显示捕获组不通过颜色叠加层工作,但它显示它们在侧窗格中正常工作。即使是最简单的捕获组也似乎不起作用。

我错过了什么?

输入是:

<@U0BUPU9QQ> 49
50
<@U0BUPU9QQ>
<@U0BUPU9QQ> noget 49 noget andet tekst 5 40
<@U0BUPU9QQ> noget andet tekst 5 40
<@U0BUPU9QQ|mn> has joined the channel

输出:

应该是<>内的ID(@除外)和行中的最后一组数字,如果没有ID,那么只有数字。

1 个答案:

答案 0 :(得分:2)

不要注意regex101 for JS上的突出显示组:如果你在右边的 MATCH INFORMATION 窗格中看到它们,它们会被匹配并正确捕获。

在JS中,这里是获取捕获组的代码(请注意m[1]是第一个捕获组文本,m[2]是第二组文本等):

var re = /^(?:<@([A-Z0-9]+)>)?.*\b([0-9]+)/gm; 
var str = '<@U0BUPU9QQ> 49\n50\n<@U0BUPU9QQ>\n<@U0BUPU9QQ> noget 49 noget andet tekst 5 40\n<@U0BUPU9QQ> noget andet tekst 5 40\n<@U0BUPU9QQ|mn> has joined the channel';
var m;
 
while ((m = re.exec(str)) !== null) {
    document.write(m[1] + "<br/>" + m[2] + "<br/><br/>");
}

关于正则表达式本身的注释:

  • ^ - 在行首开始匹配(由于m修饰符)
  • (?:<@([A-Z0-9]+)>)? - 一个可选的(由于?量词)组匹配
    • <@ - 文字<@符号
    • ([A-Z0-9]+) - (捕获组1)1个或多个字母数字符号
    • > - 关闭角括号
  • .* - 除换行符之外的0个或多个字符(尽可能多)
  • \b([0-9]+) - (捕获组2)以字边界开头的1位或更多位数

您可以根据自己的要求调整正则表达式。现在,它将匹配ID(=可选<@...>内的符号),行上的最后一个数字序列。如果您需要第一个数字序列,请使用延迟匹配.*?而不是贪婪匹配(.*)。