我有一个字符串:
strArray= "-------9---------------";
我想从字符串中找到9。字符串可能是这样的:
strArray= "---4-5-5-7-9---------------";
现在我想只找出字符串中的数字。我需要值9,4,或者这样的东西而忽略' - '。我尝试了以下方法:
strArray= strignId.split("-");
但它会出错,因为有多个' - '并且我没有得到我的输出。那么应该使用java的哪个函数?
我的输入和输出应如下:
input="-------9---------------";
output="9";
input="---4-5-5-7-9---------------";
output="45579";
我该怎么办?
答案 0 :(得分:19)
+
是“一次或多次”重复的正则表达式,因此模式-+
是“一个或多个破折号”。这将允许您使用str.split("-+")
代替,但您可能会获得一个空字符串作为第一个元素。
如果您只想删除所有-
,则可以执行str = str.replace("-", "")
。这使用了replace(CharSequence, CharSequence)
方法,该方法执行文字String
替换,即不是正则表达式模式。
如果你想要一个String[]
,每个数字都在自己的元素中,那么最简单的方法就是分两步:首先删除所有非数字,然后使用零长度断言来分割那些不是开头的字符串(?!^)
(以防止将空字符串作为第一个元素)。如果您想要char[]
,那么您只需拨打String.toCharArray()
最后,如果字符串可能很长,最好在find()
循环中使用java.util.regex.Matcher
查找数字\d
,或使用java.util.Scanner
分隔符\D*
,即非数字的序列(可能为空)。这不会给你一个数组,但你可以使用循环来填充List
(参见 Effective Java 2nd Edition,Item 25:Prefer lists to arrays )。
以下是一些例子来说明上述想法:
System.out.println(java.util.Arrays.toString(
"---4--5-67--8-9---".split("-+")
));
// [, 4, 5, 67, 8, 9]
// note the empty string as first element
System.out.println(
"---4--5-67--8-9---".replace("-", "")
);
// 456789
System.out.println(java.util.Arrays.toString(
"abcdefg".toCharArray()
));
// [a, b, c, d, e, f, g]
下一个示例首先删除所有非数字\D
,然后除了字符串(?!^)
的开头以外的任何地方拆分,以获得每个包含数字的String[]
:
System.out.println(java.util.Arrays.toString(
"@*#^$4@!#5ajs67>?<{8_(9SKJDH"
.replaceAll("\\D", "")
.split("(?!^)")
));
// [4, 5, 6, 7, 8, 9]
这使用Scanner
,\D*
作为分隔符,将每个数字作为自己的标记,使用它来填充List<String>
:
List<String> digits = new ArrayList<String>();
String text = "(&*!@#123ask45{P:L6";
Scanner sc = new Scanner(text).useDelimiter("\\D*");
while (sc.hasNext()) {
digits.add(sc.next());
}
System.out.println(digits);
// [1, 2, 3, 4, 5, 6]
split()
以下是处理String.split
时常见的初学者问题:
split
采用正则表达式这可能是最常见的初学者错误:
System.out.println(java.util.Arrays.toString(
"one|two|three".split("|")
));
// [, o, n, e, |, t, w, o, |, t, h, r, e, e]
System.out.println(java.util.Arrays.toString(
"not.like.this".split(".")
));
// []
这里的问题是|
和.
是正则表达式元字符,并且因为它们是字面上匹配的,所以它们需要通过前面的反斜杠进行转义,反斜杠作为Java字符串文字是"\\"
。
System.out.println(java.util.Arrays.toString(
"one|two|three".split("\\|")
));
// [one, two, three]
System.out.println(java.util.Arrays.toString(
"not.like.this".split("\\.")
));
// [not, like, this]
split
在默认情况下丢弃尾随空字符串有时需要保留尾随空字符串(默认情况下会丢弃split
):
System.out.println(java.util.Arrays.toString(
"a;b;;d;;;g;;".split(";")
));
// [a, b, , d, , , g]
请注意,c
,e
,f
的“缺失”值有插槽,但h
和i
没有。要解决此问题,您可以对String.split(String regex, int limit)
使用负limit
参数。
System.out.println(java.util.Arrays.toString(
"a;b;;d;;;g;;".split(";", -1)
));
// [a, b, , d, , , g, , ]
您还可以使用 n 的正limit
来最多 n - 1 次应用模式(即导致不超过 n 数组中的元素。)
split
示例以下是在零宽度匹配结构上拆分的更多示例;这可以用来分割字符串,但也保留“分隔符”。
简单的句子分割,保留标点符号:
String str = "Really?Wow!This.Is.Awesome!";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[.!?])")
)); // prints "[Really?, Wow!, This., Is., Awesome!]"
使用\G
String str = "012345678901234567890";
System.out.println(java.util.Arrays.toString(
str.split("(?<=\\G.{4})")
)); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
在大写字母之前拆分(第一个除外!)
System.out.println(java.util.Arrays.toString(
"OhMyGod".split("(?=(?!^)[A-Z])")
)); // prints "[Oh, My, God]"
以下相关问题提供了各种示例。
"abc<def>ghi<x><x>" -> "abc", "<def>", "ghi", "<x>", "<x>"
"AnXMLAndXSLT2.0Tool" -> "An XML And XSLT 2.0 Tool"
答案 1 :(得分:5)
你不使用拆分!
拆分是为了获得分隔符之间的东西。
为此,你想要消除不需要的字符; ' - '
解决方案很简单
出= in.replaceAll( “ - ”, “”);
答案 2 :(得分:0)
使用类似的东西来分割单个值。我宁愿首先消除不需要的字符,以避免在结果数组中得到空/ null字符串。
final Vector nodes = new Vector();
int index = original.indexOf(separator);
while (index >= 0) {
nodes.addElement(original.substring(0, index));
original = original.substring(index + separator.length());
index = original.indexOf(separator);
}
nodes.addElement(original);
final String[] result = new String[nodes.size()];
if (nodes.size() > 0) {
for (int loop = 0; loop smaller nodes.size(); loop++) {
result[loop] = (String) nodes.elementAt(loop);
}
}
return result;
}