如何从字符串中提取数字

时间:2014-01-31 11:22:15

标签: java regex

String a = "sin(23)+cos(4)+2!+3!+44!";
a.replaceAll("\D"); //Not working it is only extracting Digits 

我想提取仅包含!的数字(例如23),然后必须将其保存在int[]中,并且必须再次粘贴这些数字位于2!3!存在的位置。

2 个答案:

答案 0 :(得分:5)

第一件事:字符串是immutable。您试过的代码应该更像

a = a.replaceAll("\\D",""); 

其次,如果您确定不会有更多补充表达式,例如((1+2)!+3)!,那么您可以使用Matcher类中的appendReplacementappendTail方法。

String a = "sin(23)+cos(4)+2!+3!+44!";

StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("(\\d+)!");
Matcher m = p.matcher(a);
while(m.find()){
    String number = m.group(1);//only part in parenthesis, without "!"
    m.appendReplacement(sb, calculatePower(m.group(number )));
}
m.appendTail(sb);
a = sb.toString();

答案 1 :(得分:4)

使用正则表达式找到你想要的东西:

String a = "sin(23)+cos(4)+2!+3!+44!";

Pattern pattern = Pattern.compile("\\d+!"); //import java.util.regex.Pattern
Matcher matcher = pattern.matcher(a);       //import java.util.regex.Matcher
while (matcher.find()) {
    System.out.print("Start index: " + matcher.start());
    System.out.print(" End index: " + matcher.end() + " -> ");
    System.out.println(matcher.group());
}

<强>输出:

Start index: 15 End index: 17 -> 2!
Start index: 18 End index: 20 -> 3!
Start index: 21 End index: 24 -> 44!

进一步改善:

使用以下内容,您可以使用matcher.group(1)直接转换Integer.parseInt()返回值:

Pattern pattern = Pattern.compile("(\\d+)!");
...
    System.out.println(matcher.group(1));

<强>输出:

Start index: 15 End index: 17 -> 2
Start index: 18 End index: 20 -> 3
Start index: 21 End index: 24 -> 44

你能弄明白吗?您可以使用索引值替换原始字符串中的匹配项,但确保从最后一个字符串开始。