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

时间:2016-12-01 13:15:24

标签: java regex string

我正在处理模式为的正则表达式:

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

[ - 可选描述]部分当然是可选的。所以一些可能的VALID值是

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。但是使用我当前的正则表达式,匹配成功。我想我想要的是如果有一个“ - ”字符被任意数量的空格包围,如“ - ”那么它后面至少还必须有一个非空格字符。但我无法弄清楚这个正则表达式。

谢谢!

3 个答案:

答案 0 :(得分:2)

类似的东西,

^\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$

<强> Regex Demo

<强>更改

  • .{1}当您想重复一次时,不需要{}。其隐含的

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

这样的东西
^\d+\.\d+\.\d+(?:\s*-\s*[^\/\s]+)?\/\d+\.\d+\.\d+\.\d+?(?:\s*-\s*[^.\s]+)?\.\w+$

Check it out here at regex101