【问题标题】:Check for a specific suffix by RegEx and select entire match including suffix通过 RegEx 检查特定后缀并选择整个匹配项,包括后缀
【发布时间】:2019-06-20 19:57:07
【问题描述】:

首先,这是我在社区中的第一个问题,因此请专家们原谅我的错误!我正在学习正则表达式,但遇到了我无法自己创建答案的情况。

假设如果有大段,我们可以先根据特定的后缀(比如'%')进行匹配,然后才能返回并选择所需的逻辑,包括后缀?

例如部分文本是“abcd efghMNP 0.40 % ijkl mnopSNP -3.20 % xyz”。 现在在这里,如果你注意到 - 我得到了这么多 - 有像

这样的模式
/([MS]NP[\s\d\.-%]+)/

我想用空白替换“MNP 0.40 %”或“SNP -3.20 %”。更换零件似乎很容易 :) 但问题在于我所有的学习,只有在比赛结束时存在“%”时,我才能选择所需的内容。

我希望达到的匹配顺序是——如果存在后缀“%”,则匹配前一个模式,如果成功则选择包括后缀在内的所有内容并替换为空。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    有几个表达式可以这样做,例如这个添加了约束的表达式:

    [A-Z]{3}\s+[-+]?[0-9.]+\s*%
    

    测试

    const regex = /[A-Z]{3}\s+[-+]?[0-9.]+\s*%/gm;
    const str = `abcd efghMNP 0.40 % ijkl mnopSNP -3.20 % xyz
    
    "MNP 0.40 %" or "SNP -3.20 %"`;
    const subst = ``;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log(result);

    Demo 1

    或者简化版本是:

    [A-Z]{3}(.*?)%
    

    Demo 2

    【讨论】:

    • 谢谢,我也同意了,艾玛。 ([MS]NP[\s\.\d-]+%) 也可以。但是这些检查是否像 IF '%' exists THEN 那样有条件地检查?
    • @Avinash 在您使用 JavaScript 时,我建议您让 JS 执行 If else 部分和正则表达式帮助您匹配。
    【解决方案2】:

    如果遇到后缀%,则无法返回匹配,但您可以做的是使其成为模式的一部分,以便必须匹配。

    在 Javascript 中,您可以执行零长度 lookahead assertion (?= 确保右侧的内容包含模式,或者在本例中为 %,但在这种情况下,这不会是您想要的真正好处它是比赛的一部分。

    更具体的匹配可能是:

    [MS]NP\s*-?\d+(?:\.\d+)?\s*%
    
    • [MS]NP 匹配 MS 后跟 NP
    • \s*-? 匹配 0+ 次空格字符,后跟可选的 -
    • \d+(?:\.\d+)? 匹配 1+ 位数字,后跟可选部分以匹配点和 1+ 位数字
    • \s*% 匹配 0+ 个空格字符,然后匹配 %

    Regex demo

    【讨论】:

    • 嗯.. 谢谢伯德 :) “如果遇到后缀 %,您将无法返回匹配”中的“不能”是我试图打破的,但它似乎真的是什么固得先鞠躬。非常感谢您的确认:)
    • 我相信在 .NET 正则表达式中你有一个 RightToLeft 选项。看到这个页面stackoverflow.com/questions/2989606/…
    • 也许这个问题会有所帮助。见stackoverflow.com/questions/45203378/…
    • 好主意.. 非常感谢提供第二个链接。我很感激。这个想法将适用于我的座右铭,因为它可以基于给定的 '%' 符号,然后如他在示例中显示的单词 'regex' 所示倒退。太棒了! :) 愿上帝保佑你
    • 如果通过单击此答案左侧的 ✓ 有助于解决您的问题,请随时 mark the answer 接受。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2011-10-05
    • 2016-07-22
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多