我正在 try catch 1 或 2 条信息。当使用 regexr 时,它显示我的表达式正在工作并像它应该的那样捕获,但是当运行它时,它只从单个字符串捕获(在与 regexr 相同的数据上)并返回 null
剩下的。
我尝试构建表达式 here
当切换到 JS 风格时,它显示捕获组无法通过颜色叠加层工作,但它显示它们在侧 Pane 中正常工作。即使是最简单的捕获组似乎也不起作用。
我错过了什么?
输入是:
<@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 则只有数字。
最佳答案
不要注意 JS 的 regex101 上的突出显示组:如果您在右侧的MATCH INFORMATION Pane 中看到它们,则它们已正确匹配和捕获。
在 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]+)
- (Capture group 2) 1 个或多个以单词边界开头的数字
您可以根据需要调整正则表达式。现在,它将匹配 ID(=可选 <@...>
中的符号)和一行的最后一个数字序列。如果您需要第一个 数字序列,请使用惰性匹配 .*?
而不是贪婪的(.*
)。
关于Javascript 正则表达式捕获组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236949/