【问题标题】:Column separated key-value text with possible multiline strings and key-value substrings具有可能的多行字符串和键值子字符串的列分隔键值文本
【发布时间】:2014-05-03 07:49:00
【问题描述】:

这与this问题有关。

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

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

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

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

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

应该是值。

【问题讨论】:

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


    【解决方案1】:

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

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

    (?<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+: |$)
    

    【讨论】:

    • 感谢您的评论,但我需要其他结果:值应该是 "Fолько: РФ: Квартира в хорошем ~ 1500 ~!@#$%^&amp;*'()_+=-\|&lt;/&gt;{.} fdsdf[,]";:? состояние. по - оплате 25000+К/У" fdsdf[,]";` 不是键。抱歉,问题描述不清楚(请参阅更新的答案)
    • 添加到答案以适合回答实际问题
    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 2022-01-03
    • 2021-08-25
    • 2018-07-31
    • 2020-01-30
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多