列分隔键值文本与可能的多行字符串和键值子串

时间:2014-05-03 07:49:01

标签: php regex parsing preg-match preg-match-all

这与this问题有关。

这是一个正则表达式:(?<key>[^:\s]+): (?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)。 它应解析多行“key:value”对,但有一个例子未正确解析。

请你帮我修改这个原始的正则表达式。

示例,正则表达式和错误在这里(查看未着色的行):http://regex101.com/r/sH9lP9

ОПИСАНИЕ应该是关键

Fолько: РФ: Квартира `в` хорошем ~ 1500 ~`!@#$%^&*'()_+=-\|</>{.}
fdsdf[,]";:? состояние. по - оплате 25000+К/У`

应该是值。

1 个答案:

答案 0 :(得分:1)

你的正则表达式在冒号后面有一个空格,这需要在“key:value”对中冒号之后有一个空格。如果你看一下你的例子,一行不匹配,在冒号后面有一个问号,而不是空格,这使得它不匹配。

您可以使用以下解决方案之一:

(?<key>[^:\s]+): ?(?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)

在空格可选后添加问号,或者:

(?<key>[^:\s]+):\s*(?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)

在冒号之后吃掉所有可能的空格,这可能是最好的,因为它使得对空格的使用不那么严格。

或者,如果问题是需要空格并且整行应该是前一个键的值的一部分,那么您应该向子模式添加空间以确定值的结束。换句话说,你可以改变它(在末尾添加':'之后的空格):

(?<key>[^:\s]+): (?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+: |$)