代码之家  ›  专栏  ›  技术社区  ›  Stakkr

正则表达式帮助!匹配5个逗号

  •  0
  • Stakkr  · 技术社区  · 4 年前
    Date,Location,Data1,Data2,Data3,$787 - $456 - $875,6.08 - 15.52,30.46,5,5,Name,LastName,42.71
    Date,Location,Data1,Data2,Data3,$787 - $456 - $875,6.08 - 15.52 - 30.46,5,5,Name,LastName,42.71
    

    基本上,我如何使用正则表达式使第一行变得像第二行一样?

    我的逻辑正确吗?:匹配最后一个$符号和[a-z]之间的5个逗号,并将第二个逗号替换为“-”

    1 回复  |  直到 4 年前
        1
  •  2
  •   Nick    4 年前

    使用正向前瞻来查找逗号可能更容易(也更兼容不同的语言) 跟着 用另外5个逗号替换 - 使用此正则表达式:

    ,(?=(?:[^,]*,){5}[^,]*$)
    

    在JavaScript中,你可以这样做:

    let str = 'Date,Location,Data1,Data2,Data3,$787 - $456 - $875,6.08 - 15.52,30.46,5,5,Name,LastName,42.71';
    
    str = str.replace(/,(?=(?:[^,]*,){5}[^,]*$)/, ' - ');
    console.log(str);

    在PHP中:

    $str = 'Date,Location,Data1,Data2,Data3,$787 - $456 - $875,6.08 - 15.52,30.46,5,5,Name,LastName,42.71';
    $str = preg_replace('/,(?=(?:[^,]*,){5}[^,]*$)/', ' - ', $str);
    echo $str;
    

    Demo on 3v4l.org

    在Python中:

    str = 'Date,Location,Data1,Data2,Data3,$787 - $456 - $875,6.08 - 15.52,30.46,5,5,Name,LastName,42.71';
    str = re.sub(r',(?=(?:[^,]*,){5}[^,]*$)', ' - ', str);
    print(str)
    

    Demo on rextester

    在所有情况下,输出都是:

    Date,Location,Data1,Data2,Data3,$787 - $456 - $875,6.08 - 15.52 - 30.46,5,5,Name,LastName,42.71
    

    如果你的正则表达式风格不支持lookaheads,你可以用捕获组替换它:

    ,(([^,]*,){5}[^,]*)$
    

    并替换为

     - \1
    

    Oracle demo on dbfiddle