我有以下字符串:
group.cluster.namespace.release.app.pod.timer.grpc.server.processing.duration.package.method.error.count
和一个正则表达式:
(?:[^.]+\.){11}([^.]+)\.([^.]+)\.([^.]+)\.(?:[^.]+)
Group 1: package
Group 2: method
Group 3: error
现在当第 3 组是 ok
或 cancelled
时,我想不匹配。我尝试了负面预测,但没有奏效。
(?:[^.]+\.){11}([^.]+)\.([^.]+)\.(?!ok|cancelled)\.(?:[^.]+)
上面的正则表达式有什么问题?
答案 0 :(得分:4)
在负前瞻模式中,您必须再次匹配组中除点以外的任何字符。
我还建议使用 wordboundaries 来防止部分匹配,并且可能添加一个锚点 ^
来断言字符串的开头。
请注意,否定字符类 [^.]+
也可以跨换行符匹配。您可以使用 [^.\r\n]+
(?:[^.]+\.){11}([^.]+)\.([^.]+)\.(?!ok\b|cancelled\b)([^.]+)\.(?:[^.]+)
看到一个 regex demo。