匹配换行符 - \n或\ r \n?

Bas*_*i M 128 regex language-agnostic line-breaks

在写这个答案时,我必须完全匹配换行符而不是使用s-flag(dotall- dot匹配换行符).

通常用于测试正则表达式的站点在尝试匹配\n或时匹配时表现不同\r\n.

我注意到

  • Regex101仅匹配换行符\n
    (例如 - 删除\r并匹配)

  • RegExr匹配换行符既不\n 也不\r\n
    ,我无法找到的东西,使之匹配断行,除了m-flag和\s
    (例如)

  • Debuggex的行为更加不同:
    这个例子中它只匹配on \r\n,而
    在这里它只匹配on \n,同时指定相同的标志和引擎

我完全知道m-flag(多行 - ^匹配行的开头和$结尾),但有时这不是一个选项.同样\s,因为它匹配标签和空格.

我想使用unicode换行符(\u0085)不成功,所以:

  1. 是否有一种故障保护方法将匹配线路(最好不管使用的语言)整合到正则表达式中?
  2. 上述网站为什么不同的表现(尤其是Debuggex,一旦匹配只有\n一次只\r\n)?

Pet*_*Wal 183

要朝相反的方向回答;)

2)关于\ r和\n的完整解释我必须参考这个问题,这比我在这里发布的要完整得多:\n和\ r \n之间的区别?

简而言之,Linux使用\n表示新行,Windows\r \n和旧版Mac\r.因此,有多种方法可以编写换行符.您的第二个工具(RegExr)例如匹配单个\ r \n.

1)[\r\n]+正如Ilya所建议的那样,但也会连续多次连接新线.(\r\n|\r|\n)更正确.

  • @AsadSaeeduddin 那一个与 Mac 的单个 ``\r` 不匹配 (7认同)
  • @AsadSaeeduddin 不,不能。它不会匹配 Unix 行尾`\n` (5认同)

小智 13

在 PCRE 中\R匹配\n,\r\r\n.

  • @Sandwell:抱歉,我不明白你的意思,这不是一个问题,这是一个答案,比 `(\r\n|\r|\n)` 更简单 (4认同)

Dan*_*ane 8

Debuggex中的示例文本中有不同的行结尾.特别有趣的是,Debuggex似乎已经确定了您首先使用的行结尾样式,并且它将所有输入的行结尾转换为该样式.

我使用Notepad ++将Unix和Windows格式的示例文本粘贴到Debuggex中,无论我先粘贴的是Debuggex会话所坚持的内容.

因此,在将文本粘贴到Debuggex之前,应该通过文本编辑器清洗文本.确保您粘贴所需的样式.Debuggex默认为Unix风格(\n).

此外,NEL(\ u0085)完全不同:https://en.wikipedia.org/wiki/Newline#Unicode

(\r?\n)将涵盖Unix和Windows.你需要更复杂的东西,比如(\r\n|\r|\n),如果你想匹配旧的Mac.