gpt4 book ai didi

java - 解释工作正则表达式

转载 作者:行者123 更新时间:2023-12-01 15:37:50 26 4
gpt4 key购买 nike

发现此代码可以在包含双引号的情况下分解 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com