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(",");