C如何指定以空行开头并以空行结束的POSIX正则表达式?

时间:2013-07-30 19:39:02

标签: c regex pattern-matching posix

我正在尝试编写代码来扫描文件并生成“匹配”!当工具读取前面和后面跟有空行的特定代码行时的消息。我感兴趣的匹配行是:

Appliance Version 3.1.2

使用regex.h,我有一个简单的工具,可以编译我的正则表达式模式,然后对文件中的每一行执行它以搜索匹配项。该工具的基本功能很好:我能够成功搜索各种正则表达式匹配。当我尝试在上面的文本行之前和之后匹配包含空行的正则表达式时出现问题。这是我的预编译正则表达式:

[[:space:]]+\n^Appliance Version [[:alnum:]]$\n

我尝试了一系列与此类似的不同组合,似乎没有任何效果。我认为它可能与\ n有关。在这种情况下,我需要找出一种新方法来指定两个空行。任何有关POSIX正则表达式的见解都将不胜感激!

2 个答案:

答案 0 :(得分:1)

看看你的正则表达式,看起来它正在尝试匹配

Appliance Version [[:alnum:]]

在一行($)的末尾。

将匹配
Appliance Version 3

3[:alnum:])的一个实例,但不是

Appliance version 33

[[:alnum:]]只匹配一个字符),而不是

Appliance version 3.1.2

(上述问题,以及.也不是[:alnum:]的实例)

因此,您至少需要将[[:alnum:]]更改为[.[:alnum:]]*(或某些此类内容)。

此外,您对^$的使用对于显式\n是多余的,但正则表达式中没有任何内容要求匹配前面或后面跟一个空行。例如,[[:space:]]\n很乐意与该行匹配:

不是空行,但最后是空白:\ n

(我在那里明确地写了\n以在行尾显示空白字符。)

匹配空行

单个空白行与^[[:space:]]*$匹配。这与两端的换行都不匹配。如果您想在之前匹配空白行,请使用:^[[:space:]]*\nSOMETHING。要在之后匹配空白行SOMETHING\n[[:space:]]*$。或者,如果你真的想要一个前后空行:^[[:space:]]*\nSOMETHING\n[[:space:]]*$。 (但是,如果SOMETHING恰好是输入的第一行,那么这将不匹配。例如。或者最后一行。)

答案 1 :(得分:0)

正如@rici所说,您无法将\n^与两个空行相匹配 - 标记^$匹配位置,而不是文字\n字符。

要匹配空白行,请使用\n\n或 - 更好,因为您可能不希望执行任何结束上述行的硬回车,{{1 }} 在开始时。不过,您可以将(?<=\n)\n留在最后。