我在思考分割字符串数量的方法时遇到了问题。我已经做的就是将字符串拆分成多个字符。
所以如果表达式为gi356f
它会给:
g
i
3
5
6
f
但我希望将356视为自己尊重的数字。我正在处理的问题包括看起来像(345+3)*/3
我尝试查看字符串和下一个字符串中的当前字符,并尝试检查它是否为数字,如果是,则附加它们但这会导致许多错误。例如,它只能处理两位数的长数字而且不太好,如果字符串是43,它将使用3两次。 (例如,一次是43次,另一次是3次)。此外,如果最后的表达式以一定数量的给定字符串结束,如果也将被处理两次。
我不确定如何解决这个问题。我想也许可以使用正则表达式或扫描仪,但不知道如何去做,即使在网上查看一些较小的例子的代码。
答案 0 :(得分:3)
您可以使用正则表达式。这是简单情况的解决方案(只是整数)。 \\d
是小数,加号+
表示一次或多次。有关更多信息,请查看http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html。
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("(345+3)*/3");
while(m.find())
System.out.println(m.group());
}
}
答案 1 :(得分:1)
堆栈数据结构可能有所帮助。所以你可以做到这一点:
答案 2 :(得分:1)
您可以使用正则表达式。这是一个(非常粗略)草图:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
String findIntegerOccurrence(String inputString)
{
// Define pattern to match your numbers here.
Pattern pattern = Pattern.compile("... reg expr here...");
Matcher matcher = pattern.matcher(inputString);
if (matcher.find()) // Checks if the regular expression matches.
{
// Extract the substring of inputString that has matched
return matcher.group();
}
else
{
return null;
}
}
您基本上需要为数字定义适当的正则表达式,然后使用它来查找输入字符串中的所有匹配项。上面的示例只是一个草图,可以看到如何定义正则表达式并匹配它。由于您希望匹配所有出现的数字并将它们与输入的其余部分分开,因此您需要一个更精细的解决方案(上面的示例仅显示您需要的类和一些有用的方法)。
中找到有关Java中正则表达式的所有详细信息修改强>
删除编辑:我添加了所需正则表达式的描述,但在我完成更改前几分钟,已将相同的正则表达式添加为另一个答案的注释。请参考其他答案。
答案 3 :(得分:0)
如果您不需要非数字字符,请执行以下操作:
解析字符串一次,用空格替换所有非数字字符。解析生成的字符串,随着时间的推移删除双重空格。输入字符串gi356f首先变为_ 356 ,_为空格。如果你删除了双重空格,那么你就得到了你想要的东西。
另一个例子d45 * 9j变为_45_9_然后,当你将它分成子串时,你将有45和9以及单独的数字。
有很多方法可以做到这一点,最好的方法是尝试不同的方法,直到找到适合你的方法。
答案 4 :(得分:0)
我也正在创建一个计算器,我正在使用Stacks将方程式分为数字和运算符,就像@Gaurav所说的那样。这是我正在使用的代码:
for (int i=0; i<equation.length(); i++) {
equationChar = String.valueOf(equation.charAt(i));
if (numbers.contains(equationChar)) {
equationHold += equationChar;
if (i==(equation.length()-1)) {
stackNumbers.push(equationHold);
}
} else {
stackNumbers.push(equationHold);
stackOperators.push(equationChar);
equationHold = "";
}
}
我发现它比处理String Split表达式更容易。 我还没有处理括号和内容,所以代码可能会改变..
答案 5 :(得分:-1)
Pattern pp = Pattern.compile("\\d+");
Matcher m = pp.matcher("sdfsdf123sdfs3464ew111");
While(m.find())
{
System.out.println(m.group());
}
输出将是:
123
3464
111
退房!