【问题标题】:Regex for adding a word to a specific line if line does not contain the word如果行不包含单词,则用于将单词添加到特定行的正则表达式
【发布时间】:2022-11-19 01:09:02
【问题描述】:

我有一个包含多行的 YAML 文件,我知道有一行看起来像这样:

...
  schemas: core,ext,plugin
...

请注意,此行开头有未知数量的空格(因为 YAML)。该行可以由 schemas: 表达式唯一标识。 schemas 属性的现有值数量未知,但大于零。我不知道这些值是什么,除了其中之一可能是foo

如果 foo 尚未包含在任何位置的值列表中,我想使用正则表达式匹配和替换将单词 ,foo 附加到此行。 foo 可能出现在任何其他行,但我想忽略这些实例。我不想修改其他行。

我尝试过使用环视和捕获组的不同正则表达式,但都没有成功。我最近看起来很有希望的尝试是:

(?s)(?!.*foo)(.*schemas:.*)

但是,如果 foo 包含在任何其他行中,这将不匹配,这不是我想要的。

任何帮助将不胜感激。谢谢。

(顺便说一句,我使用 Java 正则表达式引擎。)

【问题讨论】:

标签: java regex


【解决方案1】:

这行得通吗?

^(?!.*foo)(s*schemas:.*)$

如果你想确保像

food, fool, etc.

匹配你可以使用这个:

^(?!.*(?:foos*$|foo,))(s*schemas:.*)$

替代品:

$1,foo

如果我正确理解了你的问题,你想确保只有一行被检查是否为负前瞻。这应该可以做到这一点。我使用 Java 8 引擎在https://regex101.com/ 上对其进行了测试。您还可以检查每个操作员在那里做什么。

解释:

^$

确保一次只考虑一行。

消极的前瞻

(?!.*(?:foos*$|foo,))

在此行中查找任何后跟(空格和换行符)或逗号的“foo”。如果你想让表达式更快,你可能会把前瞻变成后视,这样对“模式:”的简单检查就会排在第一位。但是,我不知道这是否真的提高了性能。

^(s*schemas:.*)(?<!(?:foos?$|foo,))$

对于 lookbehinds,您不能使用 * 量词,因此如果 foo 后跟多个空格,则正则表达式将匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2017-02-06
    • 2011-10-02
    • 2022-12-11
    相关资源
    最近更新 更多