我有一个字符串:
strArray= "-------9---------------";
Run Code Online (Sandbox Code Playgroud)
我想从字符串中找到9.字符串可能是这样的:
strArray= "---4-5-5-7-9---------------";
Run Code Online (Sandbox Code Playgroud)
现在我只想找出字符串中的数字.我需要值9,4,或者这样的东西而忽略' - '.我尝试了以下方法:
strArray= strignId.split("-");
Run Code Online (Sandbox Code Playgroud)
但是它会出错,因为有多个' - '并且我没有得到我的输出.那么java应该使用什么功能呢?
我的输入和输出应如下:
input="-------9---------------";
output="9";
input="---4-5-5-7-9---------------";
output="45579";
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
pol*_*nts 19
这+是"一次或多次"重复的正则表达式,因此模式-+是"一个或多个破折号".这将允许您使用str.split("-+"),但您可能会得到一个空字符串作为第一个元素.
如果你只想删除所有-,那么你可以做到str = str.replace("-", "").这使用replace(CharSequence, CharSequence)方法,执行文字String替换,即不是正则表达式.
如果你想要一个String[]每个数字在它自己的元素中,那么最简单的做法分两步:首先删除所有非数字,然后使用零长度断言来分割不是字符串开头的任何地方(?!^)(以防止变空string作为第一个元素).如果你想要一个char[],那么你可以打电话String.toCharArray()
最后,如果字符串可能很长,最好java.util.regex.Matcher在find()循环中查找数字\d,或者java.util.Scanner使用分隔符\D*,即非数字的序列(可能为空).这不会给你一个数组,但是你可以使用循环来填充a List(参见Effective Java 2nd Edition,Item 25:Prefer list 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]
Run Code Online (Sandbox Code Playgroud)
下一个示例首先删除所有非数字\D,然后除了字符串的开头之外的任何地方拆分(?!^),以获得String[]包含数字的每个数字:
System.out.println(java.util.Arrays.toString(
"@*#^$4@!#5ajs67>?<{8_(9SKJDH"
.replaceAll("\\D", "")
.split("(?!^)")
));
// [4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
这将使用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]
Run Code Online (Sandbox Code Playgroud)
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(".")
));
// []
Run Code Online (Sandbox Code Playgroud)
这里的问题是,|并且.是正则表达式元字符,并且因为它们旨在按字面匹配,所以它们需要通过前面的反斜杠进行转义,反斜杠作为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]
Run Code Online (Sandbox Code Playgroud)
split默认情况下丢弃尾随空字符串有时需要保留尾随空字符串(默认情况下会丢弃split):
System.out.println(java.util.Arrays.toString(
"a;b;;d;;;g;;".split(";")
));
// [a, b, , d, , , g]
Run Code Online (Sandbox Code Playgroud)
请注意,有对于"失踪"的价值观插槽c,e,f,但不h和i.要解决此问题,您可以使用否定limit参数String.split(String regex, int limit).
System.out.println(java.util.Arrays.toString(
"a;b;;d;;;g;;".split(";", -1)
));
// [a, b, , d, , , g, , ]
Run Code Online (Sandbox Code Playgroud)
还可以使用一个正limit的Ñ申请至多图案N - 1倍(即导致不超过Ñ数组中的元素).
split示例以下是在零宽度匹配结构上拆分的更多示例; 这可以用来分割字符串,但也保持"分隔符".
简单的句子分裂,保持标点符号:
String str = "Really?Wow!This.Is.Awesome!";
System.out.println(java.util.Arrays.toString(
str.split("(?<=[.!?])")
)); // prints "[Really?, Wow!, This., Is., Awesome!]"
Run Code Online (Sandbox Code Playgroud)
使用将长字符串拆分成固定长度的部分 \G
String str = "012345678901234567890";
System.out.println(java.util.Arrays.toString(
str.split("(?<=\\G.{4})")
)); // prints "[0123, 4567, 8901, 2345, 6789, 0]"
Run Code Online (Sandbox Code Playgroud)
在大写字母前拆分(第一个除外!)
System.out.println(java.util.Arrays.toString(
"OhMyGod".split("(?=(?!^)[A-Z])")
)); // prints "[Oh, My, God]"
Run Code Online (Sandbox Code Playgroud)
以下相关问题中提供了各种示例.
"abc<def>ghi<x><x>" -> "abc", "<def>", "ghi", "<x>", "<x>""AnXMLAndXSLT2.0Tool" -> "An XML And XSLT 2.0 Tool"| 归档时间: |
|
| 查看次数: |
5580 次 |
| 最近记录: |