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


Column separated key-value text with possible multiline strings and key-value substrings

这与这个问题有关。

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

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

示例,regex和bug在这里(看看未着色的行):http://regex101.com/r/sH9lP9

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

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

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

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

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

空格后加问号使其成为可选的,或者:

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

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

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

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