^")(""

问题描述 投票:0回答:1

我在使用regex进行CSV处理,数据可以用引号,也可以不用引号。但如果在起始列处只有一个逗号,它就会跳过它。

这是我使用的regex。(?:,"|^")(""|[\w\W]*?)(?=",|"$)|(?:,(?!")|^(?!"))([^,]*?|)(?=$|,)

现在我使用的数据例子是:,"data",moredata,"Data"应该有4个匹配["", "data", "moredata", "Data"], 但它总是跳过第一个逗号. 如果第一列上有引号,或者不是空白,那就没问题,但是如果是空的,没有引号,它就会忽略。

以下是我用于测试的示例代码,它是用Dart编写的。


void main() {

  String delimiter = ",";
  String rawRow = ',,"data",moredata,"Data"';
RegExp exp = new RegExp(r'(?:'+ delimiter + r'"|^")(^,|""|[\w\W]*?)(?="'+ delimiter + r'|"$)|(?:'+ delimiter + '(?!")|^(?!"))([^'+ delimiter + r']*?)(?=$|'+ delimiter + r')');


Iterable<Match> matches = exp.allMatches(rawRow.replaceAll("\n","").replaceAll("\r","").trim());
List<String> row = new List();
matches.forEach((Match m) {
  //This checks to see which match group it found the item in.
  String cellValue;
  if (m.group(2) != null) {
    //Data found without speech marks
    cellValue = m.group(2);
  } else if (m.group(1) != null) {
    //Data found with speech marks (so it removes escaped quotes)
    cellValue = m.group(1).replaceAll('""', '"');
  }  else {
    //Anything left
    cellValue = m.group(0).replaceAll('""', '"');
  }
  row.add(cellValue);
});
  print(row.toString());

}
regex dart
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.