【问题标题】:regex match two words based on a matching substring正则表达式根据匹配的子字符串匹配两个单词
【发布时间】:2022-07-20 20:39:57
【问题描述】:

如下图有4个字符串

ABC_FIXED_20220720_VALUEABC.csv
ABC_FIXED_20220720_VALUEABCQUERY_answer.csv
ABC_FIXED_20220720_VALUEDEF.csv
ABC_FIXED_20220720_VALUEDEFQUERY_answer.csv 

根据匹配的子字符串值(上面显示的字符串中的 VALUEABC、VALUEDEF)将两个字符串视为匹配。因此,我希望匹配前 2 个(具有 VALUEABC),然后匹配下一个 2(具有 VALUEDEF)。根据为一个正则表达式组返回的相同值来识别匹配的字符串。

到目前为止我尝试了什么

ABC.*[0-9]{8}_(.*[^QUERY_answer])(?:QUERY_answer)?.csv

这将为前 2 个字符串返回正则表达式 group-1(来自 (.*[^QUERY_answer]))值“VALUEABC”,为接下来的 2 个字符串返回“VALUEDEF”,从而实现所需的匹配。

但上述正则表达式的问题在于,只要值以“QUERY_answer”的任何字符结尾,正则表达式就不会匹配分组的任何值。例如,以下 2 个字符串根本不匹配,因为 VALUESTU 以“U”结尾:

ABC_FIXED_20220720_VALUESTU.csv
ABC_FIXED_20220720_VALUESTUQUERY_answer.csv

我尝试使用 Negative Lookahead:

ABC.*[0-9]{8}_(.*(?!QUERY_answer))(?:QUERY_answer)?.csv

但在这种情况下,grouping-1 值对于第一个字符串返回为“VALUESTU”,对于第二个字符串返回“VALUESTUQUERY_answer”,从而有效地使这两个字符串不匹配。

有什么方法可以达到所需的匹配?

【问题讨论】:

    标签: regex grouping


    【解决方案1】:

    你需要

    ABC.*[0-9]{8}_(.*?)(?:QUERY_answer)?\.csv
    

    请参阅regex demo

    注意

    • .*[^QUERY_answer] 尽可能匹配除换行符以外的任何零个或多个字符,然后匹配除QUE 等以外的任何一个字符,即否定字符类中的任何字符。这将替换为.*?,以尽可能少地匹配除换行符之外的任何零个或多个字符。
    • (?:QUERY_answer)? - 组被设为非捕获以降低分组复杂性。
    • \.csv - . 被转义以匹配文字点。

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2011-11-08
      • 2011-12-13
      • 2016-12-06
      相关资源
      最近更新 更多