【问题标题】:java.util.regex.PatternSyntaxException: Dangling meta character '?'java.util.regex.PatternSyntaxException:悬空元字符“?”
【发布时间】:2017-07-12 16:09:30
【问题描述】:

我有一个正则表达式 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+)?.+

有人可以帮我修复正则表达式吗?

【问题讨论】:

标签: java regex groovy


【解决方案1】:

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

^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)?.*

【讨论】:

  • @FedericoPiazza 修复了语法错误,但与所需的字符串不匹配 Line 3 testMessage3,能否请我修复它以匹配所需的字符串
【解决方案2】:
^Line[\s]+(?:?(\d+)\s)?\s*:?\s+(\d+)?.+
             ^----- This is a mistake

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

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

  • Line开头
  • 后跟至少 1 个空格
  • 后跟以下之一:
    • 数字和一个或多个空格和:
    • : 和一个或多个空格和数字
    • 数字
  • 后跟空格
  • 随随便便

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

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

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 2017-03-07
    • 1970-01-01
    • 2013-05-30
    • 2021-05-28
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多