特定文件结构的正则表达式

时间:2015-05-11 18:40:30

标签: regex perl

我需要用下一个简单的结构解析文件:

int

文件由2个部分组成,分隔为“\ n \ n”或“\ r \ n \ r \ n”。这个分隔符出现在我的例子中“some string 3”之后。每个部分都是可选的,即如果第一部分被省略,那么在第二部分之前将有1(但我的正则表达式我需要2个空行)空行(\ n | \ r \ n)。如果省略第二部分,则第一部分之后将有任意数量的空行(根本不包括空行)。

我正试图用这样的正则表达式获得理想的结果:

Integer

但没有成功,因为首先是“(。+)?”非常贪婪,如果我将第二部分作为非选择性的,它违反了我的要求,即两部分必须是可选的。我知道在这种情况下我可以使用split /(?:\ n | \ r \ n)/,$ str但是将来这个文件可能会有更复杂的结构,所以我不能使用split。

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

你实际上可能想要使用非贪婪的群体,因为你不想与你的分离者匹配。

(?ìsx: (?:
       (.*?)          # Non greedy
       (?:\r?\n){2,}  # also matches \r\n\n but that might not be of concern
       |\r?\n)        # one empty line.
       (.*)           # second group
)

我不知道你想用\h来实现什么。如果您想确保行中有某些内容(现在,.也可以匹配\n或空格),您可以为这些群组尝试类似(?:[^\n]+\n)*?的内容。

另外,为了简单起见,我避免使用您使用的显式?。结果可能有所不同。如果您在星标下没有任何匹配,则您将获得空字符串,如果您根本不匹配,则组变量的值为undefined。这是一个显示差异的简短示例:

"aa" =~ /(c)?(d*)aa/

此处$1undefined,而$2为空字符串。如果有人使用defined测试了组的内容,这种微小的差异可能会产生一些恼人的警告或意外结果。