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

如何处理正则表达式搜索字符串中嵌入的逗号和引号

  •  1
  • slugolicious  · 技术社区  · 6 年前

    我有一个csv文件,我想转换

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit, maecenas porttitor congue massa

    <text>
       <name>Lorem ipsum dolor sit amet</name>
       <element>consectetuer adipiscing elit</element>
       <desc> maecenas porttitor congue massa</desc>
    </text>
    

    我可以完成这个简单的案例,搜索表达式是:

    ^([^,]*),([^,]*),([^,]*),
    
    • ^ -查找行的开头
    • ([^,]*), -查找零个或多个字符 一个逗号,后跟一个逗号,并将其分组(执行3次)

    替换表达式为:

    <text>\n   <name>$1</name>\n   <element>$2</element>\n   <desc>$3</desc>\n</test>\n
    

    这适用于简单的情况。但是,有时csv中的值嵌入了逗号,在这种情况下,该值周围有引号。

    Lorem ipsum dolor sit amet, "consectetuer, adipiscing elit", maecenas porttitor congue massa
    

    因此,第二个值(它将是一个<element>)最终应为:

    <text>
       <name>Lorem ipsum dolor sit amet</name>
       <element>consectetuer, adipiscing elit</element>
       <desc> maecenas porttitor congue massa</desc>
    </text>
    

    也就是说,<element>应该有嵌入的逗号。我不需要保留报价。

    然后为了使它更混乱,字符串还可能包含引号,引号用引号转义(或者至少csv是这样给我的,它是从google工作表生成并保存为csv的)

    Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa
    

    最后我想说:

    <text>
       <name>Lorem ipsum dolor sit amet</name>
       <element>and he said, "no way!", to my astonishment</element>
       <desc> maecenas porttitor congue massa</desc>
    </text>
    

    因此,<element>应该有嵌入的逗号和转义引号(删除转义字符,这是第二个引号)。

    我在尝试创建搜索正则表达式时迷失了方向。

    2 回复  |  直到 6 年前
        1
  •  1
  •   zzxyz    6 年前

    以下几点应该管用:

    ^\s* ( " (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*))
    

    基本上是相同的模式…重复3次。 空白,后跟捕获组,捕获组可以是非逗号序列,也可以是 " 然后是(任何不是 或A "" ,最后是结束引号。

    您需要检查下面链接中的“忽略空白”按钮。

    regex storm

    使用{3}符号而不是重复模式3次可以工作,甚至可以用来替换“”,但是我有点不确定如何通过ui获得重复的捕获组

        2
  •  -1
  •   Krishna    6 年前

    我不是visual studio代码专家。但我认为这是可以做到的 没有regex

    下面的python代码应该会给出一个想法

    关键是在引号配对之前忽略逗号。

    data = 'Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa'
    items = data.split(',')
    result = []
    
    for i in range(len(items)):
        if (len(result) == 0):
            result.append(items[i])
            continue
    
        # If last item has odd number of quotes, it needs pairing - Ignore commas
        if (result[-1].count('"') % 2):
            # Append to last element
            result[-1] += ',' + items[i]
        else:
            result.append(items[i])
    
    print("\n".join(result))
    

    产量

    Lorem ipsum dolor sit amet
     "and he said, ""no way!"", to my astonishment"
     maecenas porttitor congue massa
    

    如果你需要更多的代码解释请告诉我