java String.split(regex)设计

java String.split(regex)设计,java,regex,string,Java,Regex,String,我正在导入一个包含无数行“###,##”的文件。每个数字可以是一个或两个数字 我想使用String.split(regex)获得两个没有相邻引号的数字 理解到我可以一点一点地删除第一个和最后一个字符,并使用非正则表达式分割,我希望有一个正则表达式可以使它更优雅 建议 编辑: 您也可以在引号处拆分,但这将导致长度为4的数组。不幸的是,使用string#split无法在一次调用中拆分一个字符串并删除同一字符串中的其他字符 作为替代方案,您可以使用Apache的StringUtils: String[

我正在导入一个包含无数行
“###,##”
的文件。每个数字可以是一个或两个数字

我想使用
String.split(regex)
获得两个没有相邻引号的数字

理解到我可以一点一点地删除第一个和最后一个字符,并使用非正则表达式分割,我希望有一个正则表达式可以使它更优雅

建议

编辑:


您也可以在引号处拆分,但这将导致长度为4的数组。不幸的是,使用
string#split
无法在一次调用中拆分一个字符串并删除同一字符串中的其他字符

作为替代方案,您可以使用Apache的
StringUtils

String[] n = StringUtils.removeStart( StringUtils.removeEnd( "##,##", "\""), "\"").split(",");

编辑:作为旁注,使用
StringUtils
将允许在输入字符串的开头或结尾缺少引号。如果您确定它们总是存在,那么一个简单的
子字符串(…)
就足够了。(学分归@Ingo)

使用regexp
\“(d+),(d+)\”
怎么样。然后使用
Pattern.matcher(input)
而不是
String.split
,通过
matcher.group(int)
获取数字

请考虑以下摘录:

String line = "\"1,31\"";

Pattern pattern = Pattern.compile("\"(\\d+),(\\d+)\"");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
    int firstNumber = Integer.parseInt(matcher.group(1));
    int secondNumber = Integer.parseInt(matcher.group(2));
    // do whatever with the numbers
}

您可以删除每行中的所有双引号字符,然后按

String toSplit = "\"##,##\"";
String[] splitted = toSplit.replaceAll("\"", "").split(",");

使用
toSplit
字符串中的
\“
来模拟
”、
字符串。

子字符串的拆分长度可能过大-1@Ingo你指的是哪个子串?你能详细说明一下吗?应该很明显,不是吗?如果我不能拆分“xx,xx”“因为有引号,我可以拆分子字符串xx,xx@Ingo现在我明白你的话了。很明显,你是对的。但是关于我的回答,我不理解你的评论,因为我的意思是要清楚地表明,单靠一个split调用是不可能的——你至少需要一个子字符串或其他什么来删除引号;)我的意思是作为你答案的补充——一种摆脱封闭字符的方法。子字符串应该比使用replaceAll等的所有解决方案都便宜。你说的“非正则表达式拆分”是什么意思?另外,您可以提供一个输入/输出示例。如果
“12,34”
变成
12,34
12
34
,如果我使用String.split(“,”),我会得到两半。每个都有一个引号。。。好的-不是真正的“非正则表达式”,但不是真正使用正则表达式的强度。。。
String toSplit = "\"##,##\"";
String[] splitted = toSplit.replaceAll("\"", "").split(",");