正则表达式在java split函数中包含逗号

uyhoqukh  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(101)

我希望有一个split函数,根据分隔符“”拆分String,但在某些情况下不应将其作为分隔符。
让我们说:

String= "one,two,three"
Array=String.split(",");
Arrayoutput=["one","two","three"];

字符串
则如果

String="one,two\\,three";
Array=String.split("???");


所以输出=[“one”,“two,three”];
那么如何编写正则表达式来代替“呢???”,因此它包括“,”但不包括“\,”。类似于“([,]&[^\,])”。
此外,何时将逗号而不是分隔符读取为字符串是可配置的,我现在采取\,但可以是任何东西。
P.S:我可以用下面的伪代码来解决它:

for(int i=0;i<s.length();i++){
if(s.charAt(i)=="\\,"){}
else if(s.charAt(i)==','){then split it;}
}


但我正在寻找最有效和最快的解决方案,任何其他想法如何处理这一点?

yjghlzjz

yjghlzjz1#

你应该使用Negative Look Behind。您可以在regexp10.com中查看此内容。

public static String[] split(String str) {
    final String regexp = "(?<!\\\\),";
    return str.split(regexp);
}

字符串
然后客户端的代码看起来像这样:

System.out.println(Arrays.toString(split("one,two,three")));    // ["one","two","three"] 
System.out.println(Arrays.toString(split("one,two\\,three")));  // ["one","two\,three"]

chhqkbe1

chhqkbe12#

您可能需要一个negative look behind,它将查找逗号 not 前面有一个反斜杠。许多反斜杠是必要的,因为我们不仅需要转义字符串中的反斜杠,而且需要转义结果正则表达式中的反斜杠。

"(?<!\\\\),"

字符串
在Java 12和更高版本中,支持原始字符串字面量,并且可以使我们避免一些这种转义。

`(?<!\\\\),`


现在,如果我们只想在逗号前面加上一个反斜杠,我们会使用一个 positive look behind。

`(?<=\\),`


Python中的演示,因为它的交互式解释器以易于理解的方式呈现信息。Python有自己的原始字符串语法,* 正则表达式 * 本身是相同的。

>>> import re
>>> re.split(r"(?<!\\),", r"1,2\,3")
['1', '2\\,3']
>>> re.split(r"(?<=\\),", r"1,2\,3")
['1,2\\', '3']

相关问题