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

PHP Regex只匹配一些字母/单词和标点符号

  •  1
  • mrpatg  · 技术社区  · 8 年前

    不确定这是否是正确的方法,因此如果您有更好的方法,请加入:

    我有一系列需要匹配的数据代码。这些代码本身正在被刮掉并与其他文本分离,但它们的位置和与该文本的标记只有大约70%的一致性我认为使用regex可能是一种更好的方法,不仅可以得到异常值,而且可以得到所有异常值,因为代码是非常标准的,但是我不确定如何只使用“特定”字母/括号/星号/等等作为目标字符串。下面是我的测试示例:

    3-301.11(C)*
    3-501.16 (Cold)
    5-202.11(A)
    3-501.16 (Hot)
    6-501.111(C)*
    7-201.11(A)*
    

    大多数代码都可以恢复为:

    5-103.11
    

    我能用这个表达 ^[0-9]+[-]+[0-9]+[0-9]+[.]+[0-9]+[0-9] 但结局让我失望

    我这里有样品设置:

    https://regexr.com/3smmj

    编辑

    刚尝试了弗兰克的解决方案,在我的基础上添加了.*,这很有效,但却打开了一个新的问题。由于这些代码是嵌入在文本中的,所以我的测试样本应该在代码之后包含额外的文本。我已经更新了链接/测试示例。

    解决方案 感谢大家的帮助我用(现在的)工作解决方案更新了链接。

    ^\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Wiktor Stribiżew    8 年前

    你可以用

    '~^\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?~m'
    

    或者,要匹配一行中的任何位置:

    '~\b\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?~'
    

    regex demo

    详情

    • ^ -行首(替换为 \b 单词边界(如果需要匹配一行中的任何位置)
    • \d+ -1+位
    • - -连字符
    • \d+\.\d+ -1+位数, . 和1位以上的数字
    • (?:\s*\([^()]*\)\*?)? -可选的模式匹配序列
      • \s* -0+空格
      • \( -一个 (
      • [^()]* -0+字符 ( )
      • \) -一个 )
      • \*? -可选的星号符号。

    php代码示例:

    if (preg_match_all('~\b\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?~', $s, $matches)) {
        print_r($matches[0]);
    }
    
        2
  •  1
  •   Mitya    8 年前

    从您展示的代码中,您可以将此模式简化很多:

    /\d+-\d+\.\d+/
    

    说明:

    • 一个或多个数字
    • 然后冲刺
    • 一个或多个数字
    • 然后是一个时期
    • 一个或多个数字

    注意,不需要在 [] 正如你所做的;事实上, [-] 会被曲解因为 - 里面 [] 被解释为范围运算符,例如。 [0-9] .

    推荐文章