多行命名匹配JavaScript regex不匹配regex101

p5cysglq  于 2023-06-25  发布在  Java
关注(0)|答案(2)|浏览(126)

我试图在JavaScript中创建一个命名的match正则表达式,它从多行字符串中捕获构建信息。它在regex101中测试良好,但在JavaScript中无法在exec的单次传递中正确匹配。
当我在JavaScript中尝试下面的正则表达式时,所有匹配的都是第一个匹配,即。其他所有内容都显示为undefined
当我在www.example.com测试以下内容时regex101.com

/(BuildTimestamp:)(?<timestamp>.*)|(VersionCode:)(?<major>.*)|(VersionName:)(?<minor>.*)/gm
BuildTimestamp:30-May-2023 14:25\r\n
VersionCode:6\r\n
VersionName:.0.5\r\n

我得到以下匹配:

timestamp: 30-May-2023 14:25
major: 6
minor: .0.5

在JavaScript中,我正在执行以下操作:

const regex = /(BuildTimestamp:)(?<timestamp>.*)|(VersionCode:)(?<major>.*)|(VersionName:)(?<minor>.*)/gm;

const match = regex.exec(contents);

如果我把exec放在一个循环中,我就可以在调用exec时依次捕获每个命名匹配。我希望有一种方法可以修改正则表达式查询,以便一次性捕获所有这些变量。
第一次匹配的结果如下

ffvjumwh

ffvjumwh1#

以下内容应该是不言自明的。我刚刚将\r?\n添加到正则表达式中,然后使用返回值的groups属性。

const contents =
`BuildTimestamp:30-May-2023 14:25
VersionCode:6
VersionName:.0.5`;

const regex = /BuildTimestamp:(?<timestamp>.*)\r?\nVersionCode:(?<major>.*)\r?\nVersionName:(?<minor>.*)/;

const match = regex.exec(contents);

//const { timestamp, major, minor } = match.groups;

console.log(match?.groups);
ejk8hzay

ejk8hzay2#

可以使用String.prototype.matchAll()

const regex = /(BuildTimestamp:)(?<timestamp>.*)|(VersionCode:)(?<major>.*)|(VersionName:)(?<minor>.*)/gm

const result = `BuildTimestamp:30-May-2023 14:25\r\n
VersionCode:6\r\n
VersionName:.0.5\r\n`.matchAll(regex);

console.log([...result]);

或者,您可以修改正则表达式以一次性匹配所有内容。如果不想捕获\r\n序列,您可能希望进一步调整正则表达式:

const regex = /(BuildTimestamp:)(?<timestamp>.*)(VersionCode:)(?<major>.*)(VersionName:)(?<minor>.*)/s

const result = regex.exec(`BuildTimestamp:30-May-2023 14:25\r\n
VersionCode:6\r\n
VersionName:.0.5\r\n`);

console.log(result);

相关问题