regex 正则表达式仅在前面没有空行时匹配行

deyfvvtc  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(95)

我需要匹配一个前面没有空行的行,并在它前面加上一个换行符。
所以我想把它转换成:

a = 1
b = 2

# header                    <--- do not match this
f = 10
g = 20
# header                    <--- match this
x = abc
y = def

对此:

a = 1
b = 2

# header
f = 10
g = 20

# header
x = abc
y = def

我尝试了(?!\n)(# header)和替换\n\1,但这两行都匹配:regex101 sample
(我需要这个用于ansible,所以它是python regex。
为了满足下面的评论,请注意“空”行是真的空;它不包含空格。

cgfeq70w

cgfeq70w1#

您可以替换的(零宽度)匹配项

(?<=(?<!\n)\n)(?=# header$)

"\n"
Demo
正则表达式可以分解如下。

(?<=         # begin positive lookbehind
  (?<!       # begin negative lookbehind
    \n       # match literal
  )          # end negative lookbehind
  \n         # match literal
)            # end positive lookbehind
(?=          # begin positive lookahead
  # header   # match literal
  $          # match end of string
)            # end positive lookahead

请注意,正向后看

(?<=(?<!\n)\n)

具有与相同的效果(并且可以替换为)

(?<=\n)(?<!\n\n)
bybem2ql

bybem2ql2#

我不确定你想使用哪种语言,但这里有一个使用String.replace的JavaScript示例:

let original = 
`a = 1
b = 2

# header
f = 10
g = 20
# header
x = abc
y = def`;

let replaced = original.replace(/(?<!\n\n)(# header)/, '\n$1');
console.log(replaced);

或者在python中使用Codepen

import re
s='''a = 1
b = 2

# header
f = 10
g = 20
# header
x = abc
y = def'''
x = re.sub(r'(?<!\n\n)(# header)', r'\n\1', s)
print(x)

相关问题