我写了这个简单的程序,它在每个非数字字符处拆分给定的输入。
public class Fileread {
public static void main(String[] args) throws IOException {
//Declarations
String[] temp;
String current;
//Execution
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
while ((current = br.readLine()) != null) {
temp = current.split("\\D"); //Splitting at Non Digits
for (int i = 0; i < temp.length; i++) {
System.out.println(temp[i]);
}
}
}
}
这是input.txt:
hello1world2
world3
end4of5world6
输出:
1
2
3
4
5
6
为什么会出现这么多额外空格?我需要在一个单独的行上打印每个数字,中间没有空格。我该如何解决这个问题?
答案 0 :(得分:4)
它在EACH和每个非数字处分裂。
要将非数字字符串视为一个分隔符,请指定
temp = current.split("\\D+");
代替。添加加号使模式匹配一个或多个连续的非数字字符。
答案 1 :(得分:1)
简而言之,请使用
.replaceFirst("^\\D+","").split("\\D+")
使用\D
(非数字字符匹配模式)拆分字符串意味着您一次匹配单个非数字字符,并在该字符处中断字符串。当您需要拆分字符块时,您需要匹配多个连续的字符,在您的情况下,您只需要添加{{1 +
之后的}量词。
但是,这意味着如果你的字符串在字符串的开头有一个非数字,你仍然会在索引0处有一个空元素。解决方法是使用拆分模式删除开头的子字符串。
最终的解决方案是
\\D
答案 2 :(得分:1)
$rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) {
$rootScope.tabName = fromState.name;
});
答案 3 :(得分:0)
Java的String#split
方法将为两个分隔符之间出现的每个点创建一个标记。请考虑以下示例:
String s = "a,b,c,,,f";
由于分隔符,
连续出现,中间没有任何内容,s.split(",")
会产生以下输出:
{"a", "b", "c", "", "", "f"}
你会注意到这个数组中有两个空字符串;插入一个空格来表示在每对连续逗号之间出现的标记。基本上,该字符串被视为a,b,c,(blank),(blank),f
。
解决方法是将连续分隔符视为单个分隔符。现在,重要的是要记住你对split
的论证实际上是一个正则表达式字面值。因此,您可以包含+
贪婪的正则表达式量词来告诉引擎匹配一个或多个连续的分隔符,并将它们视为单个分裂点:
s.split(",+")
对于上面的示例,现在产生以下(无空字符串):
{"a", "b", "c", "f"}
您可以使用\\D+
将相似的技术应用于正则表达式。