我正在尝试创建一个匹配键值对的正则表达式,除非它的开头有一个连字符。此正则表达式将从 yaml 文件中检测属性集。这是一个示例 yaml 文件内容
containers:
- name: api-php-container
image: us-west-2.amazonaws.com/abcd:45
ports:
- containerPort: 80
- containerPort: 443
volumeMounts:
mountPath: "/etc/keys/ssl"
- name: certs
正则表达式应该匹配所有类似键值对的行,除非它的开头有一个连字符。例如,它将匹配以下行:
image: us-west-2.amazonaws.com/abcd:45
mountPath: "/etc/keys/ssl"
这是我写的正则表达式:
^(\s*\-\s*)([\w0-9_\-\.]+)\s*:\s*([\w0-9_\-\.\/]+)\s*$
但这会检测以连字符开头的行。
然后我尝试使用否定前瞻,但随后它完全停止匹配整个事情。这是正则表达式:
^(?!(\s*\-\s))([\w0-9_\-\.]+)\s*:\s*([\w0-9_\-\.\/]+)\s*$
如何让它像我想要的那样检测?
最佳答案
您还可以确保您匹配的第一个字符不是 -
:
或空白字符:
^ *([^\s:-][^\s:]*) *: *(.+)$
在部分中,模式匹配:
^
字符串开始*
可选空格(
捕获组 1[^\s:-]
匹配除空白字符以外的单个字符:
或-
[^\s:]*
匹配除空白字符或:
之外的可选字符
)
关闭第 1 组*: *
在可选空格之间匹配:
(.+)
捕获第2组,匹配任意字符1+次$
字符串结束
关于正则表达式匹配列分隔的字符串,除非它以连字符开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68948532/