java - 解释工作正则表达式

标签 java regex csv

发现此代码可以在包含双引号的情况下分解 CSV 字段 但我不太明白正则表达式的模式匹配

如果有人可以一步步解释这个表达式如何评估模式,我将不胜感激

"([^\"]*)"|(?<=,|^)([^,]*)(?:,|$)

谢谢

==== 旧帖子

这对我来说效果很好 - 要么匹配“两个引号以及它们之间的任何内容”,要么匹配“行首或逗号与行尾或逗号之间的内容”。迭代匹配可以获取所有字段,即使它们是空的。例如,

快速的“棕色狐狸跳”过来,“那个”,“懒狗”分解为

快速的“棕色狐狸跳过”“懒狗”

import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class CSVParser { 

    /* 
     * This Pattern will match on either quoted text or text between commas, including 
     * whitespace, and accounting for beginning and end of line. 
     */ 
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");   
    private ArrayList<String> allMatches = null;         
    private Matcher matcher = null; 
    private String match = null; 
    private int size; 

    public CSVParser() {                 
        allMatches = new ArrayList<String>(); 
        matcher = null; 
        match = null; 
    } 

    public String[] parse(String csvLine) { 
        matcher = csvPattern.matcher(csvLine); 
        allMatches.clear(); 
        String match; 
        while (matcher.find()) { 
                match = matcher.group(1); 
                if (match!=null) { 
                        allMatches.add(match); 
                } 
                else { 
                        allMatches.add(matcher.group(2)); 
                } 
        } 

        size = allMatches.size();                
        if (size > 0) { 
                return allMatches.toArray(new String[size]); 
        } 
        else { 
                return new String[0]; 
        }                        
    }    

    public static void main(String[] args) {             
        String lineinput = "the quick,\"brown, fox jumps\",over,\"the\",,\"lazy dog\""; 

        CSVParser myCSV = new CSVParser(); 
        System.out.println("Testing CSVParser with: \n " + lineinput); 
        for (String s : myCSV.parse(lineinput)) { 
                System.out.println(s); 
        } 
    } 

} 

最佳答案

我尝试为您提供提示和所需词汇,以便您在 regular-expressions.info 上找到非常好的解释。

"([^\"]*)"|(?<=,|^)([^,])(?:,|$)

()是一个团体

*是一个量词

如果有?就在左括号之后,这是一个特殊的组,这里 (?<=,|^)是一个回顾断言。

方括号声明一个字符类,例如[^\"] 。这是一个特殊的,因为 ^在开始时。它是一个否定的字符类。

|表示交替,即 OR 运算符。

(?:,|$)是一个非捕获组

$是正则表达式中的特殊字符,它是一个 anchor (匹配字符串的末尾)

关于java - 解释工作正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605865/

相关文章:

java - Swing 应用程序框架 session 存储

java - 如何捕获 Room 持久性库中未处理的异常

java - Apache Lucene boost 文档部分

正则表达式:逗号分隔的整数

java - 正则表达式的替代品

java - 如何将由管道符号分隔的txt文件转换为Java中的xls文件

java - Spring 默认 bean 候选者

php正则表达式字符串替换

c++ - 如何从 .t​​xt 文件读取 CSV 列表并将每个项目分隔到自己的数组中

java - 用 Java 设计智能自定义类 csv 解析器