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

时间:2018-11-29 00:52:13

标签: regex visual-studio-code

我有一个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

因此第二个值(将是一个)应该以:

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

也就是说,应该具有嵌入式逗号。我不需要保留报价。

然后,为了使它更混乱,字符串可能还包含引号,并用引号将其转义(或者至少是从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>

因此,应该具有嵌入式逗号和转义引号(已删除转义字符,即第二个引号)。

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

2 个答案:

答案 0 :(得分:1)

遵循这些原则应该可以起作用:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        LoadListerListViewObject currentObject = loadListerListViewObjectArrayList.get(position);
        //If the object is inactive...
        if (!currentObject.getIsActivated()) {
            //Set the object as active and change the color to green
            loadListerListViewObjectArrayList.set(position, new LoadListerListViewObject(currentObject.getDate(), currentObject.getTagNumber() true));
            view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
            //If the object is active...
              } else {
                 //Set the object as active and change the color to grey
                 loadListerListViewObjectArrayList.set(position, new LoadListerListViewObject(currentObject.getDate(), currentObject.getTagNumber(), false));
                 view.setBackgroundColor(getResources().getColor(R.color.colorGreyForButton));
              }

           }

       });

基本上是相同的模式...重复了3次。 空格,然后是捕获组,捕获组是一系列非逗号,或者最好是^\s* ( " (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*)) ,后跟(不是"的任何内容)或",最后是用结束语引用。

您需要在下面的链接上单击“忽略空白”按钮。

regex storm

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

答案 1 :(得分:-1)

我不是Visual Studio代码专家。但是我认为可以不使用正则表达式

下面的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

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