提问人:John Manak 提问时间:3/3/2010 最后编辑:OneCricketeerJohn Manak 更新时间:12/4/2022 访问量:286552
如何从字符串中提取数字并获取整数数组?
How to extract numbers from a string and get an array of ints?
问:
我有一个 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-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
评论
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());
}
...prints 和 .-2
12
-?匹配前导负号 -- 可选。\d 匹配一个数字,但我们需要像在 Java 字符串中一样编写。因此,\d+ 匹配 1 位或多位数字。\
\\
评论
2,000
-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
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],但这涉及双反斜杠转义,这使得阅读更加困难。
评论
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();
这是为了提取保留小数的数字
评论
"(-?[0-9]+\\.[0-9]*|-?[0-9]*\\.[0-9]+|-?[0-9]+)"
-?
我建议检查 ASCII 值以从字符串中提取数字 假设您有一个输入字符串作为 myname12345,如果您只想提取数字 12345,您可以通过先将 String 转换为字符数组,然后使用以下伪代码来实现
for(int i=0; i < CharacterArray.length; i++)
{
if( a[i] >=48 && a[i] <= 58)
System.out.print(a[i]);
}
提取数字后,将它们附加到数组中
希望这会有所帮助
评论
如何使用java.lang.String方法:replaceAll
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”之间的字符
评论
-
9-
---6
1-2-3
接受的答案检测数字,但不检测格式化的数字,例如 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]
评论
(?:\.\d+)?
使用 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
将我们的 变成 Stream<String>
。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
我发现这个表达最简单
String[] extractednums = msg.split("\\\\D++");
使用它提取所有实数。
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;
}
}
用于表示实数的分数和分组字符可能因语言而异。根据语言的不同,相同的实数可以以非常不同的方式书写。
德语中的200万数字
2,000,000.00
和英文
2.000.000,00
一种以与语言无关的方式从给定字符串中完全提取实数的方法:
public List<BigDecimal> extractDecimals(final String s, final char fraction, final char grouping) {
List<BigDecimal> decimals = new ArrayList<BigDecimal>();
//Remove grouping character for easier regexp extraction
StringBuilder noGrouping = new StringBuilder();
int i = 0;
while(i >= 0 && i < s.length()) {
char c = s.charAt(i);
if(c == grouping) {
int prev = i-1, next = i+1;
boolean isValidGroupingChar =
prev >= 0 && Character.isDigit(s.charAt(prev)) &&
next < s.length() && Character.isDigit(s.charAt(next));
if(!isValidGroupingChar)
noGrouping.append(c);
i++;
} else {
noGrouping.append(c);
i++;
}
}
//the '.' character has to be escaped in regular expressions
String fractionRegex = fraction == POINT ? "\\." : String.valueOf(fraction);
Pattern p = Pattern.compile("-?(\\d+" + fractionRegex + "\\d+|\\d+)");
Matcher m = p.matcher(noGrouping);
while (m.find()) {
String match = m.group().replace(COMMA, POINT);
decimals.add(new BigDecimal(match));
}
return decimals;
}
如果要排除单词中包含的数字(如 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
public static String extractNumberFromString(String number) {
String num = number.replaceAll("[^0-9]+", " ");
return num.replaceAll(" ", "");
}
仅从字符串中提取数字
评论