java.util.regex.PatternSyntaxException:悬空元字符'?'

时间:2017-07-12 16:09:30

标签: java regex groovy

我有一个regEx def regex = "^Line[\\s]+(?:(\\d+)\\s)?\\s*:\\s+(\\d+)?.+";,匹配以下字符串

Line 1 : testMessage1
Line : 2 testMessage2

现在我正在尝试使用正则表达式使:成为可选项,以便它可以匹配像

这样的字符串
Line 3 testMessage3

我已尝试将我的注册表更改为^Line[\s]+(?:?(\d+)\s)?\s*:?\s+(\d+)?.+

java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 13 
^Line[\s]+(?:?(\d+)\s)?\s*:?\s+(\d+)?.+

有人可以帮我修复regEx吗?

2 个答案:

答案 0 :(得分:2)

您的正则表达式中存在语法错误:

^Line[\s]+(?:?(\d+)\s)?\s*:?\s+(\d+)?.+
             ^----- Here, remove this '?'

另一方面,如果您想将冒号作为可选项,则必须修复\s

Line\s+(?:(\d+)\s*)?\s*:?\s+(\d+)?.+
                 ^---- Here

<强> Working demo

另外,我清理了一些您可能觉得有用的正则表达式:

Line\s+(\d)?\s*:?\s*(\d)?.*

答案 1 :(得分:1)

^Line[\s]+(?:?(\d+)\s)?\s*:?\s+(\d+)?.+
             ^----- This is a mistake

?存在错误,因为:(?:...)分组表达式的一部分,而不是文字:字符。

让我们根据您的要求尝试修改您的正则表达式:

  • Line
  • 开始
  • 后面至少有一个空格
  • 其中之一:
    • 数字和一个或多个空格:
    • :以及一个或多个空格和数字
    • 位数
  • 其次是空间
  • 其他任何内容

此模式与您的3个示例匹配:

"^Line\\s+(\\d+\\s+:|:\\s+\\d+|\\d+) .*"