【问题标题】:Regex match empty lines正则表达式匹配空行
【发布时间】:2018-03-30 01:13:42
【问题描述】:

目前我有一个正则表达式,它将采用一组给定的换行符并压缩它们。我需要解决的一个挑战是modify this regex (\n{2,}),这样它在搜索多个换行符时仍然会忽略空格和制表符。

https://regex101.com/r/dEhyN3/2 展示了我所指的一个很好的工作示例。有一行只包含一个空格,导致最终结果中的新行太多。

【问题讨论】:

  • 您能否解释一下问题并将正则表达式小提琴添加到问题中?我的手机浏览器在打开 regex101 时崩溃。

标签: regex


【解决方案1】:

简介

此答案可确保保留行首的空格(如果它包含空格字符以外的内容)。


代码

See regex in use here

(?:\h*\n){2,}

注意:某些正则表达式引擎不允许\h,因此必须将其替换为[\t\p{Zs}],如果不支持Unicode 字符类,每个字符的简单列表如[\t ][^\S\n]

其他方法:

(?:\n(?:[^\S\n]*(?=\n))?){2,}
(?:\n(?:\s*(?=\n))?){2,}
\h*\n(?:\h*\n)+

结果

输入

**Language**

 - Added four languages: Italian, Portuguese (Brazil), Spanish (Mexico) and Chinese (Traditional)





**Bug fixes**


 - Fixed camera jittering for passenger sitting on the back of a motorcycle with sidecar
 - Fixed camera jittering for passenger sitting on the back of a motorcycle with sidecar

输出

**Language**

 - Added four languages: Italian, Portuguese (Brazil), Spanish (Mexico) and Chinese (Traditional)

**Bug fixes**

 - Fixed camera jittering for passenger sitting on the back of a motorcycle with sidecar
 - Fixed camera jittering for passenger sitting on the back of a motorcycle with sidecar

说明

  • (?:\h*\n){2,} 匹配任意数量的水平空白字符,后跟换行符,两次或更多次

其他方法

只是为了解释至少一种其他方法(并保留我原来的答案)

  • (?:\n(?:[^\S\n]*(?=\n))?){2,} 匹配以下两次或多次
    • \n 匹配换行符
    • (?:[^\S\n]*(?=\n))?匹配以下零次或一次
      • [^\S\n]* 匹配除\n 之外的任何空白字符任意次数
      • (?=\n) 正向前瞻确保接下来是换行符 \n

【讨论】:

  • 在 Java 和 PHP 中,\R 会比 \n 更好,因为它匹配 Windows 和 Linux 样式的换行符。
  • @Andreas 谢谢,不知道那个。 \v 怎么样(例如在 PCRE 中)?
  • \v 是“垂直空白字符:[\n\x0B\f\r\x85\u2028\u2029]”,而 \R 是“任何 Unicode 换行序列,都等效于 \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]”。基本上,\R\r\n|\v,即与\v 相同,但也匹配 Windows 的 CRLF pair
  • @Andreas 非常感谢!这给了我很好的信息:)
【解决方案2】:

这个方法比上面的答案短:

(\h*\n){2,}

Regex101

【讨论】:

  • 这只是因为从我的答案中删除了?:,这可能会导致性能下降
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2018-03-24
  • 2017-04-05
相关资源
最近更新 更多