【问题标题】:Regular expression to match optional patterns匹配可选模式的正则表达式
【发布时间】:2020-10-29 03:29:16
【问题描述】:

我知道 Regex 是一个非常热门的话题,并且有很多类似的问题,但是,我还没有找到符合我需求的问题。

我需要检查我的字符串的格式如下:

  • 所有行必须以 5 位数字开头。
  • 字符 6 到 12 必须是空格。
  • 字符 13 必须是空格或星号。
  • 如果在最后一个句点之前有句点、冒号或分号,则字符前面不能有空格,但后面必须有空格。
  • 左括号后面不能跟空格。
  • 右括号前面不能有空格。

我没有尝试实现冒号、分号或括号,但到目前为止我只停留在句号上。这些字符是可选的,所以我无法进行严格检查,我正在尝试捕捉它们,但在类似的情况下我仍然得到匹配

00000      *TEST .FINAL STATEMENT. //Matches, but it shouldn't match.
00001      *TEST2 . FINAL STATEMENT. //Matches, but it shouldn't match.
00002      *TEST3. FINAL STATEMENT. //Matches, **should** match.

这是我目前的正则表达式:

^\d{5}\s{6}[\s\*][^.]*([^.\s]+\.\s)?[^.]*\..*$

我真的不明白这是怎么发生的,特别是因为我使用 [^.] 表示我将接受除句点以外的任何内容作为通配符,并且可选模式一目了然:如果有句号,它后面不应该有空格,后面应该有空格。

【问题讨论】:

    标签: java regex regex-group


    【解决方案1】:

    试试这个:

    ^\d{5}\s{6}[\s\*]   # Your original pattern
    (?:                 # Repeat 0 or more times:
      [^.:;()]*|        # Unconstrained characters
      (?<!\s)[.:;](?=\s)|    # Punctuation after non-space, followed by space
      \((?!\s)|         # Opening parentheses not followed by space
      (?<!\s)\)         # Closing parentheses not preceeded by space
    )*
    \.$                 # Period, then end of string
    

    https://regex101.com/r/WwpssV/1

    在模式的最后一部分,有特殊要求的字符是.:;(),所以使用否定字符集来匹配除那些字符以外的任何字符:[^.:;()]*,然后替换为:

    如果在最后一个句点之前有句点、冒号或分号,则字符前面不能有空格,但后面必须有空格。

    (?&lt;!\s)[.:;](?=\s) 实现 - 仅当前面没有空格且后面有空格时才匹配其中一个字符。

    左括号后面不能跟空格。

    \((?!\s)完成

    右括号前面不能有空格。

    (?&lt;!\s)\)完成

    然后在模式结束时在这 4 种可能性之间交替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多