Regex 带通配符搜索的正则表达式?

Regex 带通配符搜索的正则表达式?,regex,Regex,我创建了一个正则表达式来检查字符串是否存在以下情况: 前4个字符是数字 紧跟着一点 后面跟着3个数字 紧跟着一点 后跟4到8个数字或字母 ie:1234.123.125B 我的正则表达式:^[0-9]{4}[.][0-9]{3}[.][0-9a-zA-Z]{4,8}$ 但是现在我需要一个通配符搜索:如果前8个字符后面有一个“*”,正则表达式也应该匹配。例如: 1234.123.12* MATCH 1234.123* MATCH 1234.123.45B9* MATCH 1234

我创建了一个正则表达式来检查字符串是否存在以下情况:

  • 前4个字符是数字
  • 紧跟着一点
  • 后面跟着3个数字
  • 紧跟着一点
  • 后跟4到8个数字或字母
ie:
1234.123.125B

我的正则表达式:
^[0-9]{4}[.][0-9]{3}[.][0-9a-zA-Z]{4,8}$

但是现在我需要一个通配符搜索:如果前8个字符后面有一个“*”,正则表达式也应该匹配。例如:

1234.123.12*   MATCH
1234.123*      MATCH
1234.123.45B9* MATCH
1234.12*       NO MATCH
1234.12345*    NO MATCH
如何将通配符搜索添加到正则表达式?
谢谢

您可以交替使用此正则表达式:

^\d{4}\.\d{3}(?:\*|\.[\da-zA-Z]{0,7}\*|\.[\da-zA-Z]{4,8})$

正则表达式详细信息:

  • ^
    :开始
  • \d{4}\.\d{3}
    :匹配4位+1点+3位
  • (?:\*\.[\da-zA-Z]{0,7}\*.[\da-zA-Z]{4,8})
    :在一个点之后匹配一个
    *
    或一个
    *
    和0到7个数字/字母,或匹配4到8个数字/字母
  • $
    :结束

您可以交替使用此正则表达式:

^\d{4}\.\d{3}(?:\*|\.[\da-zA-Z]{0,7}\*|\.[\da-zA-Z]{4,8})$

正则表达式详细信息:

  • ^
    :开始
  • \d{4}\.\d{3}
    :匹配4位+1点+3位
  • (?:\*\.[\da-zA-Z]{0,7}\*.[\da-zA-Z]{4,8})
    :在一个点之后匹配一个
    *
    或一个
    *
    和0到7个数字/字母,或匹配4到8个数字/字母
  • $
    :结束

    • 我的假设是:

      • 您不允许通配符是中间字符串
      • 您也不希望在完整模式后使用通配符(例如:
        1234.123.12345678*
      因此,您也可以使用类似以下内容:

      ^\d{4}\.\d{3}(?!.*\*.)(?![^*]{0,4}$)[.*][*\da-zA-Z]{0,8}$
      
      请参阅联机


      • ^
        -开始字符串ancor
      • \d{4}\.\d{3}
        -四位数字、一个点和另外三位数字
      • (?!.\*)
        -零个或多个字符后跟星号和除换行符以外的其他字符的负前瞻
      • (?![^*]{0,4}$)
        -对0到4个字符(字符串ancor前的星号除外)进行负前瞻
      • [.*]
        -文字点或星号
      • [*\da-zA-Z]{0,8}
        -字符类中的0到8个字符
      • $
        -结束字符串ancor

        • 我的假设是:

          • 您不允许通配符是中间字符串
          • 您也不希望在完整模式后使用通配符(例如:
            1234.123.12345678*
          因此,您也可以使用类似以下内容:

          ^\d{4}\.\d{3}(?!.*\*.)(?![^*]{0,4}$)[.*][*\da-zA-Z]{0,8}$
          
          请参阅联机


          • ^
            -开始字符串ancor
          • \d{4}\.\d{3}
            -四位数字、一个点和另外三位数字
          • (?!.\*)
            -零个或多个字符后跟星号和除换行符以外的其他字符的负前瞻
          • (?![^*]{0,4}$)
            -对0到4个字符(字符串ancor前的星号除外)进行负前瞻
          • [.*]
            -文字点或星号
          • [*\da-zA-Z]{0,8}
            -字符类中的0到8个字符
          • $
            -结束字符串ancor

          • +
            可能应该是
            {1,7}
            或者
            {1,8}
            。但这要由OP来决定。目前的模式将匹配
            1234.123.123456789*
            。我知道。我只是为OP指出这一点,因为这是他们可能忽略的东西(因为它满足了他们当前的所有示例)。答案不错:)这个
            +
            应该是
            {1,7}
            或者
            {1,8}
            。但这要由OP来决定。目前的模式将匹配
            1234.123.123456789*
            。我知道。我只是为OP指出这一点,因为这是他们可能忽略的东西(因为它满足了他们当前的所有示例)。很好的回答:)这是否意味着在完整模式后允许使用通配符?例如,
            1234.123.12345678*
            是否应该是有效的匹配项?这是否意味着在完整模式后允许使用通配符?例如,
            1234.123.12345678*
            是否应该是有效的匹配项?它实际上不需要两个负外观头。它使正则表达式的执行速度比没有任何前瞻性的正则表达式慢2倍。是的,在我的机器上,在1400个样本字符串上批量处理这个过程似乎要快11%(你的正则表达式),所以是的,在这方面你很荣幸=)。我想,步数并不总是等于速度。在regex101上,177步与350步(验证你自己)=>绝对不是11%:)@anubhava,我的模式还有一个问题(我现在已经解决了)。虽然两倍的步骤似乎并不意味着两倍的速度慢(因此处理时间减少了11%),但您肯定让我相信,没有前瞻更快。我建议OP重新考虑接受你的答案!它实际上不需要两个负面的头像。它使正则表达式的执行速度比没有任何前瞻性的正则表达式慢2倍。是的,在我的机器上,在1400个样本字符串上批量处理这个过程似乎要快11%(你的正则表达式),所以是的,在这方面你很荣幸=)。我想,步数并不总是等于速度。在regex101上,177步与350步(验证你自己)=>绝对不是11%:)@anubhava,我的模式还有一个问题(我现在已经解决了)。虽然两倍的步骤似乎并不意味着两倍的速度慢(因此处理时间减少了11%),但您肯定让我相信,没有前瞻更快。我建议OP重新考虑接受你的答案!