我有一个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());
}
答案 0 :(得分:162)
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());
}
...打印-2
和12
。
- ?匹配一个主要的负号 - 可选。 \ d匹配一个数字,我们需要在Java字符串中将\
写为\\
。所以,\ d +匹配1位或更多位数。
答案 1 :(得分:47)
如何使用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(" ")));
输出:
[-1, -2, 455, 0, 4]
描述的
[^-?0-9]+
[
和]
分隔一组要匹配的字符,即按任意顺序只有一次^
在集合开头使用的特殊标识符,用于表示匹配分隔集中存在的所有字符不,而不是集合中存在的所有字符。+
在一次和无限次之间,尽可能多次,根据需要回馈-?
其中一个字符“ - ”和“?”0-9
“0”和“9”之间范围内的字符答案 2 :(得分: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
您实际上可以用\ d替换[0-9],但这涉及双反斜杠转义,这使得它更难阅读。
答案 3 :(得分: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();
这是用于提取保留小数的数字
答案 4 :(得分:5)
接受的答案检测数字,但不检测格式化数字,例如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);
输出:
[4.8, 2,000]
答案 5 :(得分:4)
使用这个:(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
答案 6 :(得分:3)
使用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]
如果您没有负数,则可以摆脱replaceAll
(并使用!s.isEmpty()
中的filter
),因为这只是为了正确分割2-34
之类的内容(这也可以在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]
就目前而言,这些都不是仅仅使用Pattern
/ Matcher
循环结果的重大改进,如其他答案中所示,但如果您想要遵循这一点,它应该更简单随着使用流而显着简化的更复杂的操作。
答案 7 :(得分:1)
我建议检查ASCII值以从String中提取数字 假设您有一个输入字符串作为myname12345 ,如果您只想提取数字12345 ,您可以先将字符串转换为字符数组然后使用以下伪代码
for(int i=0; i < CharacterArray.length; i++)
{
if( a[i] >=48 && a[i] <= 58)
System.out.print(a[i]);
}
提取数字后,将它们附加到数组
希望这有帮助
答案 8 :(得分:1)
我发现这个表达式最简单
String[] extractednums = msg.split("\\\\D++");
答案 9 :(得分:1)
使用此提取所有实数。
public static ArrayList<Double> extractNumbersInOrder(String str){
str+='a';
double[] returnArray = new double[]{};
ArrayList<Double> list = new ArrayList<Double>();
String singleNum="";
Boolean numStarted;
for(char c:str.toCharArray()){
if(isNumber(c)){
singleNum+=c;
} else {
if(!singleNum.equals("")){ //number ended
list.add(Double.valueOf(singleNum));
System.out.println(singleNum);
singleNum="";
}
}
}
return list;
}
public static boolean isNumber(char c){
if(Character.isDigit(c)||c=='-'||c=='+'||c=='.'){
return true;
} else {
return false;
}
}
答案 10 :(得分:1)
表示实数的分数字符和分组字符可能会因语言而异。根据语言,可以用不同的方式写相同的实数。
两百万德国人
2,000,000.00
和英语
2.000.000,00
一种以与语言无关的方式从给定字符串中完全提取实数的方法:
dff %>%
rowwise() %>%
do(res = .data) %>%
.[[1]] %>%
head(1)
# [[1]]
# [[1]]$a
# [1] 1
#
# [[1]]$b
# [1] 1
答案 11 :(得分:1)
如果要排除单词中包含的数字(例如bar1或aa1bb),请在任何基于正则表达式的答案中添加单词边界\ b。例如:
Pattern p = Pattern.compile("\\b-?\\d+\\b");
Matcher m = p.matcher("9There 9are more9 th9an -2 and less than 12 numbers here9");
while (m.find()) {
System.out.println(m.group());
}
显示:
2
12
答案 12 :(得分:0)
public static String extractNumberFromString(String number) {
String num = number.replaceAll("[^0-9]+", " ");
return num.replaceAll(" ", "");
}
仅从字符串中提取数字