使用正则表达式替换空格的Java问题

使用正则表达式替换空格的Java问题,java,regex,Java,Regex,这是一节分数课。当我使用类似“2/4”的字符串测试分数类时,我得到以下异常: java.lang.NumberFormatException: For input string: "". 我认为这与试图替换空格时的sStringTo方法有关 public class Util{ static int findGCF(int a, int b){ a = Math.abs(a); b = Math.abs(b); while(a != b){ if (a

这是一节分数课。当我使用类似“2/4”的字符串测试分数类时,我得到以下异常:

java.lang.NumberFormatException: For input string: "".
我认为这与试图替换空格时的sStringTo方法有关

public class Util{

static int findGCF(int a, int b){
    a = Math.abs(a);
    b = Math.abs(b);
    while(a != b){
        if (a>b) a = a-b; else b = b-a;
    }
    return (a);
}

static Fraction sIntTo(String s){ //"2"
    int n = Integer.parseInt(s);
    return new Fraction(n);
}

static Fraction sFractionTo(String s){ //"2/3"
    s = s.trim();

    int posSlash = s.indexOf("/");
    int n = Integer.parseInt(s.substring(0,posSlash));
    int m = Integer.parseInt(s.substring(posSlash + 1));
    return new Fraction(n,m);
}

static Fraction sMixTo(String s){
    s =s.trim();
    int posB = s.indexOf(" ");
    int posSlash = s.indexOf("/");
    int w = Integer.parseInt(s.substring(0,posB));
    int t = Integer.parseInt(s.substring(posB+1, posSlash));
    int b = Integer.parseInt(s.substring(posSlash+1));
    return new Fraction(w*b+t,b);
}

static Fraction sDecTo(String s){
    s = s.trim();
    int i = s.indexOf(".");

    String sub = s.substring(i+1);

    String sNoPeriod = s.substring(0,i) + sub;

    int top = Integer.parseInt(sNoPeriod);
    int bot = 1;
    for(int j = 0; j<sub.length(); j++) bot = bot*10;
    return new Fraction(top,bot);
}
static Fraction divFraction(Fraction f, Fraction g){
    return new Fraction (f.num * g.den, f.den * g.num);
}

static Fraction addFraction(Fraction f, Fraction g){
    return new Fraction (f.num * g.den + f.den * g.num, f.den*g.den);
}

static Fraction sStringTo(String s){
    s=s.trim();
    s= s.replaceAll("\\s*/\\S*", "/");// remove 0 or more blanks before & after slash
    s = s.replaceAll("\\s+", " "); // all blanks to be one blank:  2   1/2

    int posB = s.indexOf(" ");
    int posSlash = s.indexOf("/");
    int posPed = s.indexOf(".");

    Fraction ans = null;

    if(posB>-1){
        if (posSlash>posB) { ans = sMixTo(s);}
    }else{
        if (posPed == -1 && posSlash == -1) ans = sIntTo(s); //integer only
        else{
            if(posSlash == -1) ans = sDecTo(s);// decimal only
            else{
                //with slash "2.1/2 2.1/2.1
                Fraction f = sStringTo(s.substring(0,posSlash));
                Fraction g = sStringTo(s.substring(posSlash+1));
                ans = divFraction(f,g);
            }
        }

    }
    return ans;
}//sStringTo()
公共类Util{
静态int findGCF(int a,int b){
a=数学abs(a);
b=数学abs(b);
while(a!=b){
如果(a>b)a=a-b;否则b=b-a;
}
报税表(a);
}
静态分数到(字符串s){/“2”
int n=整数.parseInt(s);
返回新分数(n);
}
静态分数分式(字符串s){/“2/3”
s=s.修剪();
int posSlash=s.indexOf(“/”);
int n=Integer.parseInt(s.substring(0,posSlash));
int m=Integer.parseInt(s.substring(posSlash+1));
返回新分数(n,m);
}
静态分数sMixTo(字符串s){
s=s.修剪();
int posB=s.indexOf(“”);
int posSlash=s.indexOf(“/”);
intw=Integer.parseInt(s.substring(0,posB));
int t=Integer.parseInt(s.substring(posB+1,posSlash));
intb=Integer.parseInt(s.substring(posSlash+1));
返回新分数(w*b+t,b);
}
静态分数sDecTo(字符串s){
s=s.修剪();
int i=s.indexOf(“.”);
String sub=s.substring(i+1);
字符串snoperation=s.substring(0,i)+sub;
int top=Integer.parseInt(snopiriod);
int-bot=1;
对于(int j=0;j-1){
如果(posSlash>posB){ans=sMixTo(s);}
}否则{
如果(posPed==-1&&posSlash==-1)ans=sIntTo(s);//仅限整数
否则{
if(posSlash==-1)ans=sDecTo(s);//仅十进制
否则{
//带斜杠“2.1/2.1/2.1”
分数f=sStringTo(s.子串(0,posSlash));
分数g=sStringTo(s.substring(posSlash+1));
ans=分数(f,g);
}
}
}
返回ans;
}//sStringTo()
有问题的堆栈跟踪是:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:662)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at Util.sIntTo(Util.java:17)
at Util.sStringTo(Util.java:75)
at Util.sStringTo(Util.java:81)
at Fraction.<init>(Fraction.java:31)
at Test.main(Test.java:6)
线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:“ 位于java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 位于java.base/java.lang.Integer.parseInt(Integer.java:662) 位于java.base/java.lang.Integer.parseInt(Integer.java:770) 在Util.sIntTo(Util.java:17) 在Util.sStringTo(Util.java:75) 在Util.sStringTo(Util.java:81) 分数。(Fraction.java:31) at Test.main(Test.java:6)
看起来你只把一个只包含空白的字符串传递到<代码> StToTo()/<代码>中。你应该考虑删除所有空白,而不是仅仅把它放在一个单独的空间中。考虑改变<代码> s=S.RePASTALL(“\s+”,“”);< <代码> > <代码> s= S.RePATALL(“\s++”,“”)。

我解决了这个问题。这是我的一个语法错误。

发布相关代码请添加完整的堆栈跟踪。您可以发布sIntTo的定义吗?根据堆栈跟踪,问题在于该函数。我添加了其余代码
s=s.replaceAll(\\s*/\\s*,“/”)
,对吗?:)顺便说一句,否决票不是我的