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

标签 java regex string

我正在研究一个正则表达式,其模式是:

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

在这些情况下,我希望模式匹配失败。但使用我当前的正则表达式,匹配成功。我认为我想要的是,如果有一个“-”字符被任意数量的空格(如“-”)包围,那么它后面还必须有至少 1 个非空格字符。但我不太明白这个的正则表达式。

谢谢!

最佳答案

类似于,

^\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 的描述

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

关于java - 如果 - 字符后面只有空格,则正则表达式匹配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40911633/

相关文章:

java - 带有 aop.xml 的 AspectJ

java - 当它存在时,Hibernate Criteria 无法解析属性

javascript - 正则表达式:在正则表达式中搜索相同的值

c - 从 C 中的字符串中提取数字

Python 浮点字符串格式不正确

php - 比较字符串

java - Servlet 代码在不同场景下转发到同一页面而不是另一个页面

java - RemoveChild 删除具有该名称的第一个子项,但跳过下一个具有相同名称的子项

java - 正则表达式任何形式的数字包括括号

javascript - 如何使用正则表达式匹配精确的字符串