正则表达式以匹配可选模式

时间:2020-10-29 03:29:16

标签: java regex regex-group

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

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

  • 所有行都必须以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)?[^.]*\..*$

我真的不知道这是怎么发生的,尤其是因为我使用[^。]表示我将接受除句点以外的任何内容作为通配符,并且可选模式一目了然:一个时期,它后面不应该有空格,并且在它之后也应该有空格。

1 个答案:

答案 0 :(得分:0)

尝试一下:

Set wsDest = Workbooks(fName) 'Worksheets("TAC Data")

https://regex101.com/r/WwpssV/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 ,因此,请使用负字符集来匹配除那些字符之外的任何字符:.:;()然后与:

交替使用

如果在最后一个句号之前有任何句号,冒号或分号,则字符前不能带空格,而后必须带空格。

[^.:;()]*填充-仅当这些字符之一不带空格且后跟空格时,才匹配。

左括号不能带有空格。

(?<!\s)[.:;](?=\s)

填充

右括号不能带空格。

\((?!\s)

填充

然后在模式结尾处的这四种可能性之间进行切换。