代码之家  ›  专栏  ›  技术社区  ›  iato

确保正则表达式不从命名材料中的数字中提取

  •  2
  • iato  · 技术社区  · 5 月前

    我有一个正则表达式字符串来抓取各种数字,但我注意到它也抓取紧随文本之后的数字。

    例如,使用以下测试句: 尼龙-12的嵌段为1.23×4E-56×-7.89 我想提取 1.23,4E-56 -7.89 。我似乎也在抓 -12 来自尼龙12。

    对于正则表达式语法来说,这是一个相当新的概念,我应该如何启动我的表达式以确保它不会从单词中抓取数字。如果任何文本字符和数字字符之间有空格,那很好,但当没有像尼龙12那样的空格时,我不想捕捉它们。

    这里提供了我用来抓取数字的正则表达式:

    [+\-]?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?(?:0|[1-9]\d*)(?:\.\d+)?)?
    

    在哪里使用 regexper 看起来像这样: regex visualized

    编辑:

    这似乎是一个与+/-运算符搜索有关的问题。我试着把一个 b 在开始时,看看结果。

    如果我扔进去 尼龙12 , 尼龙-13 ,或 尼龙+14 在正则表达式中,它返回 -13 +14 不是12。

    1 回复  |  直到 5 月前
        1
  •  1
  •   gwcoffey    5 月前

    你可以使用所谓的“积极的后向观察断言”来实现这一点。

    原则上,您希望匹配前面有空格或位于字符串开头的数字。

    在大多数正则表达式方言中,您可以使用以下语法:

    (?<=SOMETHING)
    

    Lookbind断言有点令人困惑,因为它们不直接匹配输出中的字符。相反,他们 断言 那些角色 之前 你的比赛应该符合某种模式。两者都有 积极的 消极的 (意味着前面的文本应该匹配或不匹配)版本。两者都有 回头看 向前看 版本(意味着应该检查匹配之前或之后的文本。)

    This article 很好地解释了它们。

    以下是添加了断言的相同表达式:

    (?<=^|\s)[+\-]?[+\-]?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?(?:0|[1-9]\d*)(?:\.\d+)?)?
    

    我使用的后视镜模式是 ^|\s 这意味着匹配之前应该有输入的开头( ^ )或任何空格( \s ). 你的例子没有显示出来,但我假设在这样的情况下:

    37 blocks of Nylon-12 was 1.23 by 4E-56 by -7.89
    

    这个 37 也应该归还。这个 ^ 部分会处理这个问题,因为从技术上讲,它前面没有空格。