繁体   English   中英

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

[英]How to handle embedded commas and quotes in a regular expression search string

我有一个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>应该具有嵌入式逗号。 我不需要保留报价。

然后,使其变得更混乱,该字符串可能还包含引号,并用引号将其转义(或者至少这是从Google工作表生成并保存为CSV的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>应该具有嵌入式逗号和转义引号(已删除转义字符,这是第二个引号)。

我迷上了尝试创建搜索正则表达式的过程。

遵循以下原则应该可以:

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

基本上是相同的模式...重复了3次。 空格,后跟一个捕获组,该捕获组可以是一系列非逗号,或者最好是一个"之后是(任何非" )或"" ,最后是一个引号。

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

正则表达式风暴

使用{3}表示法而不是重复模式3次是可以的,甚至可以用来代替“”,但是我不确定如何通过UI进入重复的捕获组。

我不是视觉工作室代码专家。 但是我认为没有正则表达式就可以做到

以下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

如果您需要有关代码的更多说明,请告诉我

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM