正则表达式:带有多行文本的负前视

regex: negative lookahead with multiline text

提问人:macbert 提问时间:11/2/2023 更新时间:11/3/2023 访问量:56

问:

我有几个带有文本块的文件:

  maxlength:
    maxlength_js: 500
    maxlength_js_label: 'Inhalt auf @limit Zeichen begrenzt, verbleibend: <strong>@remaining</strong>'
    maxlength_js_enforce: true
    maxlength_js_truncate_html: false

有时maxlength_js_enforce:true 存在有时不存在。 我想通过查找和替换将maxlength_js_enforce:true添加到所有这些maxlenght:块中。

我试图找到所有maxlength:没有maxlength_js_enforce的块,带有负前瞻的正则表达式模式,但不知何故,我无法让它与多行一起使用,并且对这种块的结尾没有真正的限制。

我已经尝试过这样的模式 下面是一个示例,其中包含一个包含多个此类块的整个文件的示例 https://regexr.com/7mjh1 确保打开整个文件示例以了解问题。(maxlength:(\s*.*))(?!enforce)

它要么匹配许多行,要么不够匹配,即使存在“强制”,它也是匹配的。 我想我没有得到正确的概念,并且在文件中指定这样一个块的边界时有问题,猜它一定很简单,但不明白。

正则表达式 regex-lookarounds 正则表达式否定

评论

0赞 Wiktor Stribiżew 11/2/2023
你会在 JavaScript 或任何其他代码中使用正则表达式吗?
0赞 dawg 11/2/2023
我想通过查找和替换将 maxlength_js_enforce: true 添加到所有这些 maxlenght: 块中。用什么工具?
0赞 Wiktor Stribiżew 11/2/2023
这可能有效,但这取决于您在哪里使用正则表达式以及您拥有的确切文本。
1赞 dawg 11/2/2023
由于这是 YAML,因此您可以考虑使用 YAML 解析器...
1赞 Wiktor Stribiżew 11/2/2023
所以用(?m)^(\h*)maxlength:(?:\R\1(?!\h*maxlength_js_enforce:)(\h+).*)*$(?!\R\1\h)$0\n$1$2maxlength_js_enforce: true

答:

1赞 Tenatus 11/3/2023 #1

我在模式中添加了多行标志,以便使用 ^ 作为行首。这将在每个组中匹配,直到并包括可选的现有密钥:

^((\x20*)maxlength:.*([\r\n]+\2\x20{2}(?!\x20*maxlength_js_enforce:).*)+)([\r\n]+\2\x20*maxlength_js_enforce:.*)?

您可以用 this 替换以添加/替换所需的设置:

$1\n$2  maxlength_js_enforce: true

这也适用于替换(尽管演示中没有这方面的示例)maxlength_js_enforce: false

1赞 Wiktor Stribiżew 11/3/2023 #2

你可以使用

(?m)^(\h*)maxlength:(?:\R\1(?!\h*maxlength_js_enforce:)(\h+).*)*$(?!\R\1\h)

然后,您需要替换为

$0\n$1$2maxlength_js_enforce: true

请参阅正则表达式演示

细节

  • (?m)- 内联选项Pattern.MULTILINE
  • ^- 行的开头
  • (\h*)- 第 1 组:零个或多个水平空格
  • maxlength:- 文本
  • (?:\R\1(?!\h*maxlength_js_enforce:)(\h+).*)*- 零个或多个序列
    • \R- 任何换行符序列
    • \1- 与第 1 组中的值相同(缩进空格序列)
    • (?!\h*maxlength_js_enforce:)- 后面没有零个或多个水平空格,然后是文本maxlength_js_enforce:
    • (\h+)- 第 1 组:一个或多个水平空格
    • .*- 生产线的其余部分
  • $- 行的尽头...
  • (?!\R\1\h)- 之后没有立即跟换行符,该值与组 1 中捕获的值相同,然后是单个水平空格。

替换模式将匹配的文本替换为自身 (),然后添加换行符 ()、组 1 值 ()、组 2 值 (),然后添加文本。$0\n$1$2maxlength_js_enforce: true$0\n$1$2maxlength_js_enforce: true