java匹配字符串中的正则表达式模式(列出匹配部分和非匹配部分)

java匹配字符串中的正则表达式模式(列出匹配部分和非匹配部分),java,regex,string,match,Java,Regex,String,Match,我有一个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 m

我有一个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
private static final String TEXT_IN_DBL_QUOTES_REGEX=“\”([^\“]*)\”;
私有静态最终字符串rowData=“\“Field1\”、\“Field2\”、\“Field4\”、“;
公共静态void main(字符串[]args){
列表字段=Lists.newArrayList();
Pattern regex=Pattern.compile(文本在\u DBL\u引号中\u regex);
Matcher Matcher=regex.Matcher(rowData);
while(matcher.find()){
add(matcher.group(1));
}
返回字段;
}
我的预期结果是一个数组列表,其中包含
字段1,字段2,空,字段4,空
但上述情况正在回归
场1,场2,场4

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

您可以这样调整正则表达式:

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);

使用上面的regex仍然会给我下面的“域名”、“13test.com”、“USer5”、==>[Domain Name,13test.com,USer5]为什么不使用一个完全支持引用字段的CSV读取器?从架构上讲,在api被批准在我们的环境中使用之前,我不能使用此api调用,而且分隔符上存在歧义,如“,“因为我将逗号分隔的文本作为字段的值。感谢您的响应…CSV库也可以处理包含“,”的字符串。但是如果CSV中的字符串应该包含
,例如
“Field1”,“this is”“quoted”“,“Field4”,则此操作将失败“
-根据csv标准,双引号字段中的双引号必须在双引号之前。对于这些情况,最好使用csv解析器库。目前我的要求是防止字符串包含双引号,因此我目前对解决方案很在行
[Field1, Field2, null, Field4, null]