regex:多行文本的负先行

ss2ws0br  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(116)

我有几个这样的文本块文件:

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_js_enforcemaxlength: 块,但不知何故,我无法让它在多行和没有真实的限制的情况下工作。
我已经尝试了这样的模式(maxlength:(\s*.*))(?!enforce)这里是一个例子,整个文件与多个占用这样的块https://regexr.com/7mjh1确保打开整个文件的例子,以了解问题。
它要么匹配到很多行,要么匹配不够,即使“enforce”存在,它也是一个匹配。我想我没有正确地理解这个概念,并且在文件中指定这样一个块的边界时遇到了问题,我猜它一定很简单,但没有得到它。

lawou6xi

lawou6xi1#

您可以使用

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

字符串
然后,您需要替换为

$0\n$1$2maxlength_js_enforce: true


参见regex demo

  • 详情 *:
  • (?m)-Pattern.MULTILINE内联选项
  • ^-一行的开始
  • (\h*)-组1:零个或多个水平空白
  • maxlength:- a文本
  • (?:\R\1(?!\h*maxlength_js_enforce:)(\h+).*)*-零个或多个序列
  • \R-任意换行符序列
  • \1-与第1组中的值相同(缩进空白序列)
  • (?!\h*maxlength_js_enforce:)-后面不跟零个或多个水平空格,然后是maxlength_js_enforce:文本
  • (\h+)-组1:一个或多个水平空白
  • .*-线路的其余部分
  • $-线的末端.
  • (?!\R\1\h)-后面不紧跟着换行符,与第1组中捕获的值相同,然后是单个水平空格。

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

dl5txlt9

dl5txlt92#

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

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

字符串
您可以使用此替换来添加/替换您想要的设置:

$1\n$2  maxlength_js_enforce: true


这也将取代maxlength_js_enforce: false(尽管在演示中没有这样的例子)

相关问题