Joh*_*nak 102 java regex arrays string
我有一个String变量(基本上是一个带有未指定数字的英文句子),我想将所有数字提取到一个整数数组中.我想知道是否有正则表达式的快速解决方案?
我使用了Sean的解决方案并稍微改了一下:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Run Code Online (Sandbox Code Playgroud)
Sea*_*wen 165
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There are more than -2 and less than 12 numbers here");
while (m.find()) {
System.out.println(m.group());
}
Run Code Online (Sandbox Code Playgroud)
...打印-2
和12
.
- ?匹配一个主要的负号 - 可选.\ d匹配一个数字,我们需要\
像\\
Java字符串一样编写.所以,\ d +匹配1位或更多位数.
Max*_*tin 48
如何使用replaceAll
java.lang.String方法:
String str = "qwerty-1qwerty-2 455 f0gfg 4";
str = str.replaceAll("[^-?0-9]+", " ");
System.out.println(Arrays.asList(str.trim().split(" ")));
Run Code Online (Sandbox Code Playgroud)
输出:
[-1, -2, 455, 0, 4]
Run Code Online (Sandbox Code Playgroud)
描述
[^-?0-9]+
Run Code Online (Sandbox Code Playgroud)
[
并且]
分隔一组要匹配的字符,即,任何顺序只有一次^
在集合开头使用的特殊标识符,用于指示匹配分隔集中不存在的所有字符,而不是集合中存在的所有字符.+
在一次和无限次之间,尽可能多次,根据需要回馈-?
其中一个字符是" - "和"?"0-9
"0"和"9"之间的字符sid*_*eal 18
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(myString);
while (m.find()) {
int n = Integer.parseInt(m.group());
// append n to list
}
// convert list to array, etc
Run Code Online (Sandbox Code Playgroud)
您实际上可以用\ d替换[0-9],但这涉及双反斜杠转义,这使得它更难阅读.
小智 9
StringBuffer sBuffer = new StringBuffer();
Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+");
Matcher m = p.matcher(str);
while (m.find()) {
sBuffer.append(m.group());
}
return sBuffer.toString();
Run Code Online (Sandbox Code Playgroud)
这是用于提取保留小数的数字
接受的答案检测数字,但不检测格式化数字,例如2,000,也不检测小数,例如4.8.用于此类用途-?\\d+(,\\d+)*?\\.?\\d+?
:
Pattern p = Pattern.compile("-?\\d+(,\\d+)*?\\.?\\d+?");
List<String> numbers = new ArrayList<String>();
Matcher m = p.matcher("Government has distributed 4.8 million textbooks to 2,000 schools");
while (m.find()) {
numbers.add(m.group());
}
System.out.println(numbers);
Run Code Online (Sandbox Code Playgroud)
输出:
[4.8, 2,000]
使用 Java 8,您可以执行以下操作:
String str = "There 0 are 1 some -2-34 -numbers 567 here 890 .";
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+"))
.filter(s -> !s.matches("-?"))
.mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]
Run Code Online (Sandbox Code Playgroud)
如果你没有负数,你可以去掉replaceAll
(并使用!s.isEmpty()
in filter
),因为这只是为了正确地分割类似的东西2-34
(这也可以纯粹用正则表达式 in 来处理split
,但它相当复杂)。
Arrays.stream
将我们String[]
变成Stream<String>
.
filter
删除前导和尾随的空字符串以及任何-
不属于数字的字符串。
mapToInt(Integer::parseInt).toArray()
呼吁parseInt
每个人String
给我们一个int[]
。
或者,Java 9 有一个Matcher.results方法,该方法应该允许类似以下内容:
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 .");
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890]
Run Code Online (Sandbox Code Playgroud)
就目前情况而言,与仅使用Pattern
/循环结果相比,这些都没有很大的改进Matcher
,如其他答案所示,但如果您想用更复杂的操作来跟进,那么它应该更简单,这些操作可以通过使用来显着简化溪流。