在Java中使用模式解析

在Java中使用模式解析,java,regex,string,parsing,csv,Java,Regex,String,Parsing,Csv,我想使用parsingMethod解析文件的行 test.csv Frank George,Henry,Mary / New York,123456 ,Beta Charli,"Delta,Delta Echo ", 25/11/1964, 15/12/1964,"40,000,000.00",0.0975,2,"King, Lincoln ",Alpha 这是我读台词的方式 public static void main(String[] args) throws Exception {

我想使用parsingMethod解析文件的行

test.csv

 Frank George,Henry,Mary / New York,123456
,Beta Charli,"Delta,Delta Echo
", 25/11/1964, 15/12/1964,"40,000,000.00",0.0975,2,"King, Lincoln ",Alpha
这是我读台词的方式

 public static void main(String[] args) throws Exception {


        File file = new File("C:\\Users\\test.csv");
        BufferedReader reader = new BufferedReader(new FileReader(file));   
        String line2;
        while ((line2= reader.readLine()) !=null) {
            String[] tab = parsingMethod(line2, ",");
            for (String i : tab) {
                System.out.println( i );
            }
        }


    }

    public static String[] parsingMethod(String line,String parser) {

        List<String> liste = new LinkedList<String>();
        String patternString ="(([^\"][^"+parser+ "]*)|\"([^\"]*)\")" +parser+"?";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher =pattern.matcher(line);

        while (matcher.find()) {
            if(matcher.group(2) != null){
                liste.add(matcher.group(2).replace("\n","").trim());
            }else if(matcher.group(3) != null){
                liste.add(matcher.group(3).replace("\n","").trim());
            }       
        }

        String[] result = new String[liste.size()];
        return liste.toArray(result);
    }
}
我想删除此“, 有谁能帮我改进我的模式吗


预期产量

Frank George
Henry
Mary / New York
123456
Beta Charli
Delta
Delta Echo
25/11/1964
15/12/1964
40,000,000.00
0.0975
2
King
Lincoln
Alpha
Delta
Delta Echo

第3行的输出

25/11/1964
15/12/1964

40
000
000.00


0.0975
2

King
Lincoln

我无法复制你的结果,但我想也许你想把第二个捕获组的引号去掉,如下所示:

"(([^\"][^"+parser+ "]*)|\"([^\"]*))\"" +parser+"?"

编辑:对不起,这不起作用。也许你想让第一组中的任何数量的
^\“
,比如:
([^,\“]*)\\”([^\“]*)\”,
你的代码没有正确编译,但这是由于一些
没有被转义造成的

但这应该可以做到:

String patternString = "(?:^.,|)([^\"]*?|\".*?\")(?:,|$)";
Pattern pattern = Pattern.compile(patternString, Pattern.MULTILINE);
(?:^.,|)
是一个非捕获组,它匹配行首的单个字符

([^\“]*?\”*?“*?\”
是一个捕获组,它匹配除“以外的所有内容”或“两者之间的任何内容”

(?:,|$)
是与行尾或逗号匹配的非捕获组


注意:
^
$
仅在使用pattern.MULTILINE标志编译模式时按说明工作。因为我可以看到行是相关的,所以请尝试以下操作:

    public static void main(String[] args) throws Exception {

        File file = new File("C:\\Users\\test.csv");
        BufferedReader reader = new BufferedReader(new FileReader(file));
        StringBuilder line = new StringBuilder();
        String lineRead;
        while ((lineRead = reader.readLine()) != null) {
            line.append(lineRead);
        }
        String[] tab = parsingMethod(line.toString());
        for (String i : tab) {
            System.out.println(i);
        }


    }

    public static String[] parsingMethod(String line) {

        List<String> liste = new LinkedList<String>();
        String patternString = "(([^\"][^,]*)|\"([^\"]*)\"),?";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(line);

        while (matcher.find()) {
            if (matcher.group(2) != null) {
                liste.add(matcher.group(2).replace("\n", "").trim());
            } else if (matcher.group(3) != null) {
                liste.add(matcher.group(3).replace("\n", "").trim());
            }
        }

        String[] result = new String[liste.size()];
        return liste.toArray(result);
    }


作为Delta,Delta Echo在引号中,这应该出现在同一行!就像King,Lincoln一样,这是如何编译的?您正在为patternString分配一个strigns数组。
String patternString=“(([^\”][^“,”]*)\([^\“]*)\”,“?”;
这段代码没有编译,您在:
String PatternStrinstringString=“(([^\],“],”)上有一个错误([^\"]*)\")","?"琼:我不擅长模式字符串。但是这段代码可以编译。我从控制台复制了输出。@RicardoCacheira:我不擅长模式字符串。但是这段代码可以编译。我从控制台复制了输出。阿纳纳说,你必须替换双反斜杠,但即使你这样做,程序也不会返回输出。我试过了。我没有在模式中。现在我已经更正了我的代码()请参见问题。我将您的模式字符串放入了我的代码中。它给我错误`java.lang.IndexOutOfBoundsException:No group 2`此模式一次返回一个组,因此没有组2。要检查是否有组要签出
matcher.groupCount()
如果您真的想拥有多个组,请使用以下命令:
String patternString=“(?:(?:^.,|))([^\”*?\“*?”*?*?\”(:,|$)+”;
(我没有测试这个,但我应该可以工作)@B8rede:不工作相同的errore java.lang.IndexOutOfBoundsException:没有组2使用
if(matcher.groupCount()>=2){.lister.add(matcher.group)(2).replace(“\n”,”).trim();}如果(matcher.groupCount()>=3){liste.add(matcher.group(3).replace(“\n”,”).trim();}
它将检查是否有第2组,如果有,请使用它。第3组也一样。很抱歉,我不明白你在说什么。如果我的解决方案不起作用,我相信其他人会费心用勺子将其发送给你。我请求你检查我的代码。我的代码中有patternString,我无法解析“。我想删除”“还有。对于您的PatternString,我的输出类似于,、000.00,问题是我无法复制您的结果。在将第3行传递给parserMethod时,您可以输出它吗?如果您将其更改为此
([^,\“]*)|\”([^\“]*)\”),?
?这对我来说毫无意义。请尝试输出第3行,以便我可以重现您的结果。我指的不是输出,而是输入,即作为parseMethod()参数提供的字符串你的模式字符串和我的PatternString是相同的。只有当你把文件内容看作一个字符串时,这才是输出。你必须逐行读取文件并把它发送给PARSETHORD。对不起,伙计,但是你告诉我,在第3行的引号上标出了接近于第2行的引文,所以它告诉我这些行是相关的。d、 如果不是的话,你不知道你想要什么!!!是的,第3行的开头与第2行开始的引语很接近。但这是第3行,我必须分别分析每一行。这就是为什么我阅读每一行并使用该方法进行分析。很抱歉不清楚。希望你现在理解并帮助我解决这个问题。这对我来说没有意义我,但好吧!为了讲清楚,你能告诉我这是什么行以及你想做什么吗?我将尝试帮助你在test.csv中生成哪些行?
    public static void main(String[] args) throws Exception {

        File file = new File("C:\\Users\\test.csv");
        BufferedReader reader = new BufferedReader(new FileReader(file));
        StringBuilder line = new StringBuilder();
        String lineRead;
        while ((lineRead = reader.readLine()) != null) {
            line.append(lineRead);
        }
        String[] tab = parsingMethod(line.toString());
        for (String i : tab) {
            System.out.println(i);
        }


    }

    public static String[] parsingMethod(String line) {

        List<String> liste = new LinkedList<String>();
        String patternString = "(([^\"][^,]*)|\"([^\"]*)\"),?";
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(line);

        while (matcher.find()) {
            if (matcher.group(2) != null) {
                liste.add(matcher.group(2).replace("\n", "").trim());
            } else if (matcher.group(3) != null) {
                liste.add(matcher.group(3).replace("\n", "").trim());
            }
        }

        String[] result = new String[liste.size()];
        return liste.toArray(result);
    }
Frank George
Henry
Mary / New York
123456
Beta Charli
Delta,Delta Echo
25/11/1964
15/12/1964
40,000,000.00
0.0975
2
King, Lincoln
Alpha