Php 列分隔的键值文本,可能包含多行字符串和键值子字符串

Php 列分隔的键值文本,可能包含多行字符串和键值子字符串,php,regex,parsing,preg-match,preg-match-all,Php,Regex,Parsing,Preg Match,Preg Match All,这与问题有关 这是一个正则表达式:(?[^:\s]+):(?(?>[^\n]*\R)*?[^\n]*)(?=\R\s+:|$)。 它应该解析多行“key:value”对,但有一个示例解析不正确 你能帮我修改一下这个原始的正则表达式吗 例如,这里有regex和bug(请看未着色的行): 应为键 Fолько: РФ: Квартира `в` хорошем ~ 1500 ~`!@#$%^&*'()_+=-\|</>{.} fdsdf[,]";:? состояние. по

这与问题有关

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

你能帮我修改一下这个原始的正则表达式吗

例如,这里有regex和bug(请看未着色的行):

应为键

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

应该是值。

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

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

(?<key>[^:\s]+): ?(?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)
(?[^:\s]+):?(?(?>[^\n]*\R)*?[^\n]*)(?=\R\s+:|$)
空格后添加的问号使其成为可选,或:

(?<key>[^:\s]+):\s*(?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)
(?[^:\s]+):\s*(?(?[^\n]*\R)*?[^\n]*)(?=\R\s+:|$)
它会吃掉冒号后面所有可能的空格,这可能是最好的,因为它使得对空格的使用不那么严格

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

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

谢谢您的评论,但我需要其他结果:值应为“Föааааа:Баааааааа
():?ааааааааа25000+а/У“
fdsdf[,]”不是一个键。很抱歉,没有在答案中添加对问题的清晰描述(请参阅更新的答案),以适合回答实际问题
(?<key>[^:\s]+): (?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+: |$)