首页 > 解决方案 > 正则表达式不匹配字符串中的确切单词

问题描述

我有以下字符串:

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 组是or时不匹配。我尝试了否定的前瞻,但它不起作用。okcancelled

(?:[^.]+\.){11}([^.]+)\.([^.]+)\.(?!ok|cancelled)\.(?:[^.]+)

上面的正则表达式有什么问题?

标签: regex

解决方案


在具有负前瞻的模式中,您必须在组中再次匹配除点之外的任何字符。

我还建议使用 wordboundaries 来防止部分匹配,并可能添加一个锚^来断言字符串的开头。

请注意,否定字符类[^.]+也可以跨换行符匹配。您可以使用排除换行符[^.\r\n]+

(?:[^.]+\.){11}([^.]+)\.([^.]+)\.(?!ok\b|cancelled\b)([^.]+)\.(?:[^.]+)

查看正则表达式演示


推荐阅读