gpt4 book ai didi

java - java中\"的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:25 24 4
gpt4 key购买 nike

我需要为从文件中读取的字符串写一个正则表达式

apple,boy,cat,"dog,cat","time\" after\"noon"

I need to split it into

appleboycatdog,cattime"after"noon

I tried using

Pattern pattern = 
Pattern.compile("[\\\"]");
String items[]=pattern.split(match);

对于第二部分,我没有得到正确的答案,你能帮我解决这个问题吗?

最佳答案

由于您的问题更多的是解析问题而不是正则表达式问题,因此这是另一个可行的解决方案:

public class CsvReader {

Reader r;
int row, col;
boolean endOfRow;

public CsvReader(Reader r){
this.r = r instanceof BufferedReader ? r : new BufferedReader(r);
this.row = -1;
this.col = 0;
this.endOfRow = true;
}

/**
* Returns the next string in the input stream, or null when no input is left
* @return
* @throws IOException
*/
public String next() throws IOException {
int i = r.read();
if(i == -1)
return null;

if(this.endOfRow){
this.row++;
this.col = 0;
this.endOfRow = false;
} else {
this.col++;
}

StringBuilder b = new StringBuilder();
outerLoop:
while(true){
char c = (char) i;
if(i == -1)
break;
if(c == ','){
break;
} else if(c == '\n'){
endOfRow = true;
break;
} else if(c == '\\'){
i = r.read();
if(i == -1){
break;
} else {
b.append((char)i);
}
} else if(c == '"'){
while(true){
i = r.read();

if(i == -1){
break outerLoop;
}
c = (char)i;
if(c == '\\'){
i = r.read();
if(i == -1){
break outerLoop;
} else {
b.append((char)i);
}
} else if(c == '"'){
r.mark(2);
i = r.read();
if(i == '"'){
b.append('"');
} else {
r.reset();
break;
}
} else {
b.append(c);
}
}
} else {
b.append(c);
}
i = r.read();
}

return b.toString().trim();
}


public int getColNum(){
return col;
}

public int getRowNum(){
return row;
}

public static void main(String[] args){

try {
String input = "apple,boy,cat,\"dog,cat\",\"time\\\" after\\\"noon\"\nquick\"fix\" hello, \"\"\"who's there?\"";
System.out.println(input);
Reader r = new StringReader(input);
CsvReader csv = new CsvReader(r);
String s;
while((s = csv.next()) != null){
System.out.println("R" + csv.getRowNum() + "C" + csv.getColNum() + ": " + s);
}
} catch(IOException e){
e.printStackTrace();
}
}
}

运行这段代码,我得到了输出:

R0C0: apple
R0C1: boy
R0C2: cat
R0C3: dog,cat
R0C4: time" after"noon
R1C0: quickfix hello
R1C1: "who's there?

这应该能很好地满足您的需求。

但有一些免责声明:

  • 它不会捕获 CSV 格式语法中的错误,例如值中间的未转义引号。
  • 它不会执行任何字符转换(例如将“\n”转换为换行符)。反斜杠只会导致后面的字符按字面意思处理,包括其他反斜杠。 (如果您需要额外的功能,这应该很容易改变)
  • 一些 csv 文件通过将引号加倍而不是使用反斜杠来转义引号,此代码现在同时查找两者。

编辑:查找 csv 格式,发现没有真正的标准,但更新了我的代码以捕获通过加倍而不是反斜杠转义的引号。

编辑 2:已修复。现在应该像宣传的那样工作。还对其进行了修改以测试行号和列号的跟踪。

关于java - java中\"的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179716/

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