正则表达式匹配列分隔的字符串,除非它以连字符开头

标签 regex

我正在尝试创建一个匹配键值对的正则表达式,除非它的开头有一个连字符。此正则表达式将从 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+次
  • $ 字符串结束

Regex demo

关于正则表达式匹配列分隔的字符串,除非它以连字符开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68948532/

相关文章:

python - 优化python中大文件的正则表达式和文件读取操作

ruby - 正则表达式匹配人类可读的数字

python - 如何用破折号替换所有空格、制表符、换行符、逗号和下划线?

javascript - .split(/\s+/) 和 .split ("") 之间的区别?

java - 匹配除 B 或 S 之外的一个或多个非数字

c# - 用于匹配多种日期格式的正则表达式

javascript - Javascript 中的方括号正则表达式

Javascript::如何将关联数组的键获取到数组变量?

regex - Powershell正则表达式以匹配IP和两个通配符

regex - 在 Linux 中,名称与正则表达式匹配的文件的磁盘使用情况?