Javascript 正则表达式捕获组不起作用

Mat*_*sen 5 javascript regex

我正在尝试捕获 1 或 2 条信息。当使用 regexr 时,它显示我的表达式正在正常工作和捕获,但在运行它时,它仅从单个字符串捕获(与 regexr 中的数据相同)并返回null其余内容。

我尝试在这里构建表达式

当切换到 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
Run Code Online (Sandbox Code Playgroud)

输出:

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

Wik*_*żew 7

不要注意 regex101 for JS 上的突出显示组:如果您在右侧的“匹配信息”窗格中看到它们,则它们已正确匹配并捕获。

在 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/>");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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