【问题标题】:java-Match a regex pattern in a string(listing matching and non-matching parts)java-匹配字符串中的正则表达式模式(列出匹配和不匹配的部分)
【发布时间】:2015-03-25 14:01:56
【问题描述】:

我有一个 csv 字符串,其中包含五个字段(3 个必需字段和 2 个可选字段)。可选字段位于位置 3 和 5。 我有一个正则表达式模式来识别双引号中的字符串

    private static final String TEXT_IN_DBL_QUOTES_REGEX="\"([^\"]*)\"";
    private static final String rowData="\"Field1\", \"Field2\", , \"Field4\", ";

    public static void main(String[] args){
        List<String> fields = Lists.newArrayList();
        Pattern regex = Pattern.compile(TEXT_IN_DBL_QUOTES_REGEX);
        Matcher matcher = regex.matcher(rowData);
        while(matcher.find()){
           fields.add(matcher.group(1));
        }
        return fields;
    }

My expected result is an array list containing 
Field1, Field2, null, Field4, null
but the above is returning 
Field1, Field2, Field4

如何调整上述代码以获得所需的结果?

【问题讨论】:

  • 使用上面的正则表达式仍然给了我下面的 "Domain Name","13test.com", ,"USer5", ==>[Domain Name, 13test.com, USer5]
  • 为什么不使用完全支持引用字段的 CSV 阅读器? opencsv.sourceforge.net
  • 在架构上我不能使用这个 api 调用,直到 api 被批准在我们的环境中使用,而且分隔符“,”有歧义,因为我有逗号分隔的文本作为字段的值。感谢您的回复...
  • CSV-Lib 也可以处理包含 "," 的字符串。

标签: java regex string match


【解决方案1】:

你可以像这样调整你的正则表达式:

String TEXT_IN_DBL_QUOTES_REGEX="\"([^\"]*)\"|(?<=,) *(?=,|$)";
String rowData="\"Field1\", \"Field2\", , \"Field4\", ";

List<String> fields = new ArrayList<>();
Pattern regex = Pattern.compile(TEXT_IN_DBL_QUOTES_REGEX);
Matcher matcher = regex.matcher(rowData);
while(matcher.find()) {
    fields.add(matcher.group(1));
}
System.out.println (fields);

输出:

[Field1, Field2, null, Field4, null]

【讨论】:

  • 但是如果 csv 中的字符串应该包含 ",例如 "Field1", "This is ""quoted""", , "Field4",则此操作失败 - 根据 csv 标准,双引号字段中的双引号必须在前面加上双引号。
  • 对于这些情况,最好使用 csv 解析器库。
  • 现在我的要求阻止字符串包含双引号,所以我现在对解决方案很好
猜你喜欢
  • 2021-02-09
  • 2016-01-04
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2021-03-30
  • 2011-11-08
  • 2015-10-25
相关资源
最近更新 更多