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



这与这个问题有关。

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

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

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

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

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

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

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

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

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

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

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

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

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

最新更新