首页 > 解决方案 > 为什么这个正则表达式没有捕获两个匹配的行?

问题描述

我有以下文本文件:

a
a

我正在尝试匹配以a使用以下命令开头的行:pcregrep -M '^a'. 它只匹配第一个a而不匹配第二个。有谁知道为什么?我使用pcregrep它是因为这是一个简单的问题,稍后我将扩展到更复杂的场景。

谢谢!

更新

原因是我使用的是 Mac OS,其中每个换行符都是回车符。因此,pcgrep 将文件内容(即 a\ra)解释为一行,并且我的正则表达式仅返回a该行的第一行,因为这就是我在表达式中指定的全部内容。使用 pcregrep 的解决方案是指定换行符类型。“换行类型”是指正则表达式引擎解释为指定行尾的字符。因此,如果我们在这种情况下指定换行符类型为回车符 (\r),pcregrep 会将我的文件内容解释为两行,并将匹配并返回两行。

我的正则表达式的固定版本是pcregrep -M -N CR '^a',其中的-N CR意思是“换行符类型是回车”。

标签: regexpcregrep

解决方案


由于您在 MasOS 中创建了一个文本文件,因此行结尾用 CR(回车)符号(\r, \x0D,ASCII 表中索引为 13 的字符)表示。

默认情况下,pcregrep其他类似的工具\n将 LF(换行)符号视为换行符。

你应该告诉pcregrep使用 CR 作为换行符使用-N选项:

pcregrep -o -N CR '^a' file
            ^^^^^

推荐阅读