提问人:macbert 提问时间:11/2/2023 更新时间:11/3/2023 访问量:56
正则表达式:带有多行文本的负前视
regex: negative lookahead with multiline text
问:
我有几个带有文本块的文件:
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)
它要么匹配许多行,要么不够匹配,即使存在“强制”,它也是匹配的。 我想我没有得到正确的概念,并且在文件中指定这样一个块的边界时有问题,猜它一定很简单,但不明白。
答:
我在模式中添加了多行标志,以便使用 ^ 作为行首。这将在每个组中匹配,直到并包括可选的现有密钥:
^((\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
你可以使用
(?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
$2
maxlength_js_enforce: true
上一个:正则表达式 - 不包含某些字符
下一个:从两个字符串中捕获一串数字
评论
(?m)^(\h*)maxlength:(?:\R\1(?!\h*maxlength_js_enforce:)(\h+).*)*$(?!\R\1\h)
$0\n$1$2maxlength_js_enforce: true