【问题标题】:Regex to find every second new line (match only new line characters)正则表达式查找每隔一个新行(仅匹配新行字符)
【发布时间】:2020-04-18 19:46:14
【问题描述】:

正则表达式查找每隔一个新行(仅匹配新行字符)

输入:

LINE1
LINE2
LINE3
LINE4
LINE5
LINE6

输出:

LINE1LINE2
LINE3LINE4
LINE5LINE6

我尝试过\n[^\n]*\n,但它也匹配文本以进行替换,并且没有提供所需的输出。

我在仅匹配每两个换行符时遇到问题。

提前致谢!

【问题讨论】:

  • 如果你的目标是从你的“输入”中产生你的“输出”,我建议你把注意力集中在你的问题上,而不是试图强迫一种特定的方法来达到这个结果。
  • 感谢您的 cmets 和评论。我需要以某种方式限制它的原因是因为我需要的解决方案不能将匹配的字符串作为替换输入。这就是我发现很难仅匹配换行符的原因。很抱歉之前没有说清楚
  • 如果行是偶数:\n(?=(?:.+\n.+\n)*.+$)regex101.com/r/8WfdLP/1

标签: regex


【解决方案1】:

你可以使用正则表达式

^(.*)\n(.*\n)

并将每个匹配项替换为$1+$2

Demo

或者,您可以简单地匹配每对行并删除第一个换行符。当然,这需要一些代码。由于您没有指出您使用的是哪种语言,我将用一些 Ruby 代码来说明这一点,读者应该会发现这些代码很容易翻译成任何高级语言。假设str 是一个保存多行字符串的变量。那么:

r = /^(?:.*\n){2}/
s = str.gsub(r) { |s| s.sub(/\n/, '') }
puts s
LINE1LINE2
LINE3LINE4
LINE5LINE6

【讨论】:

  • 我已经产生了你想要的结果。考虑到您的结果可以通过保留每对行中除第一个换行符之外的所有内容或将每对字符串的第一个换行符转换为空字符串来获得结果,这还不够吗?
  • 感谢您的 cmets 和评论。我需要以某种方式限制它的原因是因为我需要的解决方案不能将匹配的字符串作为替换输入。这就是我发现很难仅匹配换行符的原因。很抱歉之前没有说清楚
【解决方案2】:

对于偶数行,您可以使用正向前瞻来断言右侧的内容是 0 次或多次重复以换行符结尾的 2 行,然后匹配最后一行和结尾字符串。

在替换中使用空字符串。

\n(?=(?:.+\n.+\n)*.+$)

说明

  • \n 匹配换行符
  • (?= 正向前瞻,断言右边是
    • (?:.+\n.+\n)* 匹配 0+ 次 2 行后跟换行符
    • .+$ 匹配除换行符以外的任何字符 1 次以上并断言字符串结尾
  • ) 关闭前瞻

Regex demo

输出

LINE1LINE2
LINE3LINE4
LINE5LINE6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多