Java 匹配可选模式的正则表达式

Java 匹配可选模式的正则表达式,java,regex,regex-group,Java,Regex,Regex Group,我知道正则表达式是一个非常热门的话题,有很多类似的问题,但是,我还没有找到一个符合我需要的 我需要检查字符串的格式,如下所示: 所有行必须以5位数字开头 字符6到12必须是空白 字符13必须为空格或星号 如果在最后一个句点之前有任何句点、冒号或分号,则字符前面不得有空格,但后面必须有空格 左括号后面不能有空格 右括号前面不能有空格 我还没有尝试实现冒号、分号或括号,但到目前为止,我只停留在句号上。这些字符是可选的,所以我无法进行严格检查,我正在尝试捕捉它们,但在类似这样的情况下,我仍能找到匹

我知道正则表达式是一个非常热门的话题,有很多类似的问题,但是,我还没有找到一个符合我需要的

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

  • 所有行必须以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)?[^.]*\..*$
我真的看不出这是怎么回事,特别是因为我使用[^.]表示我将接受除句点以外的任何内容作为通配符,并且可选模式乍一看是正确的:如果有句点,它后面不应该有空格,后面应该有空格。

试试这个:

^\d{5}\s{6}[\s\*]#您的原始模式
(?:#重复0次或更多次:
[^.:;()]*|#无约束字符
(?

在模式的最后一部分中,具有特殊要求的字符是
:;()
,因此使用负数字符集来匹配除这些字符以外的任何字符:
[^.:;()]*
,然后替换为:

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

(?)完成-仅当前面没有空格且后面有空格时,才匹配其中一个字符

左括号后面不能有空格

\(?!\s)

右括号前面不能有空格

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