我需要用下一个简单的结构解析文件:
int
文件由2个部分组成,分隔为“\ n \ n”或“\ r \ n \ r \ n”。这个分隔符出现在我的例子中“some string 3”之后。每个部分都是可选的,即如果第一部分被省略,那么在第二部分之前将有1(但我的正则表达式我需要2个空行)空行(\ n | \ r \ n)。如果省略第二部分,则第一部分之后将有任意数量的空行(根本不包括空行)。
我正试图用这样的正则表达式获得理想的结果:
Integer
但没有成功,因为首先是“(。+)?”非常贪婪,如果我将第二部分作为非选择性的,它违反了我的要求,即两部分必须是可选的。我知道在这种情况下我可以使用split /(?:\ n | \ r \ n)/,$ str但是将来这个文件可能会有更复杂的结构,所以我不能使用split。
有人可以帮我这个吗?
答案 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/
此处$1
为undefined
,而$2
为空字符串。如果有人使用defined
测试了组的内容,这种微小的差异可能会产生一些恼人的警告或意外结果。