【问题标题】:To findout which REGEX is matching with given String in JavaScript找出哪个 REGEX 与 JavaScript 中的给定字符串匹配
【发布时间】:2021-08-26 06:49:34
【问题描述】:

我正在使用下面的 JavaScript 代码通过测试方法检查给定的 REGEX 是否与字符串匹配。

const str = 'AUGUST PRODUCT UPDATES AND NEWSLETTER';

const regex = new RegExp('.*INAWS.*|.*INAWS P4.*|.*INAWSP4.*|.*P4 INAWS.*|.*P4INAWS.*|.*INAWS P3.*|.*INAWSP3.*|.*P3 INAWS.*|.*P3INAWS.*|.*INAWS P2.*|.*INAWSP2.*|.*P2 INAWS.*|.*P2INAWS.*|.*INAWS P1.*|.*INAWSP1.*|.*P1 INAWS.*|.*P1INAWS.*|.*INSAP.*|.*INSAP P4.*|.*INSAPP4.*|.*P4 INSAP.*|.*P4INSAP.*|.*INSAP P3.*|.*INSAPP3.*|.*P3 INSAP.*|.*P3INSAP.*|.*INSAP P2.*|.*INSAPP2.*|.*P2 INSAP.*|.*P2INSAP.*|.*INSAP P1.*|.*INSAPP1.*|.*P1 INSAP.*|.*P1INSAP.*|.*INFW.*|.*INFW P4.*|.*INFWP4.*|.*P4 INFW.*|.*P4INFW.*|.*INFW P3.*|.*INFWP3.*|.*P3 INFW.*|.*P3INFW.*|.*INFW P2.*|.*INFWP2.*|.*P2 INFW.*|.*P2INFW.*|.*.*|.*INFW P1.*|.*INFWP1.*|.*P1 INFW.*|.*P1INFW.*|.*INSEC.*|.*INSEC P4.*|.*INSECP4.*|.*P4 INSEC.*|.*P4INSEC.*|.*INSEC P3.*|.*INSECP3.*|.*P3 INSEC.*|.*P3INSEC.*|.*INSEC P2.*|.*INSECP2.*|.*P2 INSEC.*|.*P2INSEC.*|.*INSEC P1.*|.*INSECP1.*|.*P1 INSEC.*|.*P1INSEC.*');

console.log(regex.test(str));

​以上代码返回true

但我不知道哪个 REGEX 关键字与上面给定的字符串匹配。我希望没有一个关键字与给定的字符串匹配,但不知道为什么它返回true

谁能帮我找出匹配的正则表达式,或者我误解了任何错误,因为我是 Javascript 新手?

【问题讨论】:

  • 您可能需要分别检查每个模式,例如在一个大的 if-else 中。
  • 匹配的是.*.*
  • 只需将每个单一模式放入一个数组中,然后循环通过它找出匹配的。
  • 嗨@Bravo 非常感谢。我通过将 REGEX 分为 4 部分开始调试。 findout 匹配 REGEX 在第 3rdrow 但不是确切的关键字,在看到您的评论后,我可以知道。

标签: javascript regex string


【解决方案1】:

鉴于您用于创建正则表达式的原始字符串,您可以以不同的方式使用该字符串 - 就像这样

const str = 'AUGUST PRODUCT UPDATES AND NEWSLETTER';
const regexString = '.*INAWS.*|.*INAWS P4.*|.*INAWSP4.*|.*P4 INAWS.*|.*P4INAWS.*|.*INAWS P3.*|.*INAWSP3.*|.*P3 INAWS.*|.*P3INAWS.*|.*INAWS P2.*|.*INAWSP2.*|.*P2 INAWS.*|.*P2INAWS.*|.*INAWS P1.*|.*INAWSP1.*|.*P1 INAWS.*|.*P1INAWS.*|.*INSAP.*|.*INSAP P4.*|.*INSAPP4.*|.*P4 INSAP.*|.*P4INSAP.*|.*INSAP P3.*|.*INSAPP3.*|.*P3 INSAP.*|.*P3INSAP.*|.*INSAP P2.*|.*INSAPP2.*|.*P2 INSAP.*|.*P2INSAP.*|.*INSAP P1.*|.*INSAPP1.*|.*P1 INSAP.*|.*P1INSAP.*|.*INFW.*|.*INFW P4.*|.*INFWP4.*|.*P4 INFW.*|.*P4INFW.*|.*INFW P3.*|.*INFWP3.*|.*P3 INFW.*|.*P3INFW.*|.*INFW P2.*|.*INFWP2.*|.*P2 INFW.*|.*P2INFW.*|.*.*|.*INFW P1.*|.*INFWP1.*|.*P1 INFW.*|.*P1INFW.*|.*INSEC.*|.*INSEC P4.*|.*INSECP4.*|.*P4 INSEC.*|.*P4INSEC.*|.*INSEC P3.*|.*INSECP3.*|.*P3 INSEC.*|.*P3INSEC.*|.*INSEC P2.*|.*INSECP2.*|.*P2 INSEC.*|.*P2INSEC.*|.*INSEC P1.*|.*INSECP1.*|.*P1 INSEC.*|.*P1INSEC.*';

const patterns = regexString.split('|');
const regex = new RegExp(`(${patterns.join(')|(')})`);
const matches = str.match(regex);
if (matches) {
    const listOfMatches = Object.entries(matches.slice(1)).filter(([index, match]) => match).map(([index, match]) => [patterns[index], match]);
    console.log(listOfMatches);
}

【讨论】:

  • 嗨@Bravo,感谢您提供解决方案和您的时间。
【解决方案2】:

如果要检查 str 中的哪个单词与正则表达式模式匹配,可以将 str 分解为数组中的单词。

const str = 'AUGUST PRODUCT UPDATES AND NEWSLETTER';
let wordList = str.split(" ");

这样,您可以对每个单词运行 RegExp.prototype.test() 方法并查看哪个单词与正则表达式模式匹配。

const regex = new RegExp(...);
const str = 'AUGUST PRODUCT UPDATES AND NEWSLETTER';

let result = [];
let wordList = str.split(" ");

wordList.map(word => {
    if(regex.test(word)) {
        result.push(word);
    }
});
console.log(result); // matched words will be logged in array format

【讨论】:

  • 嗨@Kouta Nakano,感谢您的解决方案。我想要哪个模式与给定的字符串匹配。您的代码将返回所有匹配的关键字。总之谢谢你的建议
  • 我明白了。祝你好运!
【解决方案3】:

要匹配正则表达式的某些部分,您需要用大括号封装每个模式。这在正则表达式中称为“组”。比使用 match() 函数获取更多信息。你会得到一个数组作为结果。第一项始终是匹配的整个字符串。以下所有项目都是每个组的匹配项。看看这段代码:

const str = 'AUGUST PRODUCT UPDATES AND NEWSLETTER';

const regex = '/(.*INAWS.*)|(.*INAWS P4.*)|(.*INAWSP4.*)|(.*P4 INAWS.*)|(.*P4INAWS.*)|(.*INAWS P3.*)|(.*INAWSP3.*)|(.*P3 INAWS.*)|(.*P3INAWS.*)|(.*INAWS P2.*)|(.*INAWSP2.*)|(.*P2 INAWS.*)|(.*P2INAWS.*)|(.*INAWS P1.*)|(.*INAWSP1.*)|(.*P1 INAWS.*)|(.*P1INAWS.*)|(.*INSAP.*)|(.*INSAP P4.*)|(.*INSAPP4.*)|(.*P4 INSAP.*)|(.*P4INSAP.*)|(.*INSAP P3.*)|(.*INSAPP3.*)|(.*P3 INSAP.*)|(.*P3INSAP.*)|(.*INSAP P2.*)|(.*INSAPP2.*)|(.*P2 INSAP.*)|(.*P2INSAP.*)|(.*INSAP P1.*)|(.*INSAPP1.*)|(.*P1 INSAP.*)|(.*P1INSAP.*)|(.*INFW.*)|(.*INFW P4.*)|(.*INFWP4.*)|(.*P4 INFW.*)|(.*P4INFW.*)|(.*INFW P3.*)|(.*INFWP3.*)|(.*P3 INFW.*)|(.*P3INFW.*)|(.*INFW P2.*)|(.*INFWP2.*)|(.*P2 INFW.*)|(.*P2INFW.*)|(.*.*)|(.*INFW P1.*)|(.*INFWP1.*)|(.*P1 INFW.*)|(.*P1INFW.*)|(.*INSEC.*)|(.*INSEC P4.*)|(.*INSECP4.*)|(.*P4 INSEC.*)|(.*P4INSEC.*)|(.*INSEC P3.*)|(.*INSECP3.*)|(.*P3 INSEC.*)|(.*P3INSEC.*)|(.*INSEC P2.*)|(.*INSECP2.*)|(.*P2 INSEC.*)|(.*P2INSEC.*)|(.*INSEC P1.*)|(.*INSECP1.*)|(.*P1 INSEC.*)|(.*P1INSEC.*)/';

console.log(str.match(regex));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多