【问题标题】:Regex match text between groups match组之间的正则表达式匹配文本匹配
【发布时间】:2019-03-21 17:20:30
【问题描述】:

我正在做一个正则表达式来分隔作为一个键:值文本条目类似于这个

QA~BlaBlaBlaWE~1235123FA~blablablaER~blabla123ZX~2342blaaa

我已经能够将它分开,但是当尝试将 Group3 作为键并将 Group4 作为值时

质量保证~BlaBlaBla

它保留在 Group2 (QA) 和 Group3 中的值 (BlaBlaBla)

我的正则表达式是这样的

((\w{2}~)?(.*?)(\w{2}~|$))

关键是能够创建这样的列表

> Key Value 
> QA BlaBlaBla 
> WE 1235123 
> FA blablabla 
> ER blabla123 
> ZX 2342blaaa

这是一个例子 https://regex101.com/r/Xh8RAA/1

我无法很好地创建正则表达式,以便所有内容都在 Group3 和 Group4 中,有人可以帮助我

【问题讨论】:

    标签: javascript python regex


    【解决方案1】:

    你可以试试这个Regular Expression:

    /.{2}~[^~]+((?=..~)|$)/g
    

    检查结果如下:

    console.log("QA~BlaBlaBlaWE~1235123FA~blablablaER~blabla123ZX~2342blaaa".match(/.{2}~[^~]+((?=..~)|$)/g));

    使用下面的代码,您可以将其作为对象 (key/val):

    function CustomSplit(s){
      var r={};
      s.match(/(.{2})~([^~]+((?=..~)|$))/g).forEach(function(a){a=a.split("~"); r[a[0]]=a[1];});
      return r;	
    }
    console.log(CustomSplit("QA~BlaBlaBlaWE~1235123FA~blablablaER~blabla123ZX~2342blaaa"));

    【讨论】:

      【解决方案2】:

      您可以使用积极的前瞻模式来避免消耗下一个标头令牌:

      ([A-Z]{2})~(.*?)(?=[A-Z]{2}~|$)
      

      将匹配替换为第 1 组和第 2 组,后跟换行符,您将获得所需的输出。

      演示:https://regex101.com/r/Xh8RAA/2

      【讨论】:

        【解决方案3】:

        您正在寻找的是lookahead,它将检查当前位置是否跟在某个模式之后,而不会消耗模式中的字符。您还可以删除包含整个正则表达式的不必要的捕获组,这样您就可以让组 1 包含键,组 2 包含值,而无需任何其他组。此外,由于密钥是必需的,因此密钥组不应是可选的:

        (\w{2})~(.*?)(?=\w{2}~|$)
        

        https://regex101.com/r/Xh8RAA/6

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-11
          • 1970-01-01
          相关资源
          最近更新 更多