繁体   English   中英

如果-字符后只有空格,则正则表达式匹配失败

[英]Regular expression match fails if only whitespace after the - character

我正在研究模式为的正则表达式:

1.0.0[ - optional description]/1.0.0.0[ - optional description].txt

[-可选说明]部分当然是可选的。 所以一些可能的有效值是

1.0.0/1.0.0.0.txt
1.0.0/1.0.0.0 - xyz.txt
1.0.0 - abc/1.0.0.0 - xyz.txt
1.0.0 - abc/1.0.0.0.txt

为了使模式匹配更可靠一些,我想在“-”字符前后匹配零个或多个空格。 因此,所有这些都是有效的。

1.0.0 - abc/1.0.0.0 - xyz.txt
1.0.0-abc/1.0.0.0-xyz.txt
1.0.0    -abc/1.0.0.0-     xyz.txt

要进行此匹配,我具有以下正则表达式(Java代码):

String part1 = "((\\d+.{1}\\d+.{1}\\d+)(\\s*-\\s*(.+))?)";
String part2 = "((\\d+.{1}\\d+.{1}\\d+.{1}\\d+)(\\s*-\\s*(.+))?\\.sql)";
pattern = Pattern.compile(part1+ "/" + part2);

到目前为止,此正则表达式运行良好。 但是当进行单元测试时,我发现一个案例我还不太清楚。 用例是如果包含“-”字符的字符串被1个或多个空格包围,但是在“-”字符后没有描述。 看起来像:

1.0.0 - /1.0.0.0.txt
1.0.0- /1.0.0.0-xyz.txt

在这些情况下,我希望模式匹配为FAIL。 但是用我当前的正则表达式,匹配成功了。 我想我想要的是,如果有一个“-”字符被任意数量的空格包围,例如“-”,那么它后面也必须至少有一个非空格字符。 但是我不太清楚这个正则表达式。

谢谢!

就像是,

^\d+\.\d+\.\d+(?:\s*-\s*\w+)?\/\d+\.\d+\.\d+\.\d+(?:\s*-\s*\w+)?.txt$

或者,您可以将\\.\\d+重复项组合为

^\d+(?:\.\d+){2}(?:\s*-\s*\w+)?\/\d+(?:\.\d+){3}(?:\s*-\s*\w+)?.txt$

正则表达式演示


变化

  • .{1}如果您想重复一次,则不需要{} 其隐式

  • (?:\\s*-\\s*\\w+)匹配零个或多个空格( \\s* ),后跟- ,另一个空格,然后\\w+表示长度大于1的描述

    • ? 在此模式的末尾使此选项成为可选。
    • 最后再次重复相同的模式以匹配第二部分。
  • ^在字符串开头锚定正则表达式。
  • $将正则表达式固定在字符串的末尾。 这两个是必需的,因此字符串中没有其他内容。
  • 除非有必要捕获模式,否则不要使用()对模式进行分组。 这会导致内存浪费。 如果要对模式进行分组但不捕获它们,请使用(?:..)

在与可选部分匹配的组中,您需要用\\\\S+替换.+ ,其中\\S表示任何非空白字符。 这将强制可选部分包括非空格字符以匹配模式:

String part1
    = "((\\d+\\.\\d+\\.\\d+)(\\s*-\\s*(\\S+))?)";

String part2
    = "((\\d+\\.\\d+\\.\\d+.{1}\\d+)(\\s*-\\s*(\\S+))?\\.txt)";

另请注意, .{1} (与.相同)匹配任何字符。 在示例中,您要匹配一个点,因此应将其替换为\\.

就像是

^\d+\.\d+\.\d+(?:\s*-\s*[^\/\s]+)?\/\d+\.\d+\.\d+\.\d+?(?:\s*-\s*[^.\s]+)?\.\w+$

在regex101处检查

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM