a=b,c=d,e=123.5,string.getchar()格式化为
a = b , c = d , e = 123.5 , string . getchar ( ) 
当.作为小数点时两端无空格对于a>=b,>=之间不再添加空格,即a >= b这是我写的,split用于指定符号两端添加的符号,可以不是空格一运行就死在那里了……private boolean isPunct(char c){
if(c>=33&&c<=47 || c>=58&&c<=64 || c>=123&&c<=126) return true;
else return false;
}

public String formater(String s, char split){
StringBuilder line = new StringBuilder(s);

for(int i = 0; i<=line.capacity(); i++){
if(isPunct(line.charAt(i))){
if(isPunct(line.charAt(i+1))){//double punctuations
line.insert(i-1, split);
line.insert(i+2, split);
}else if(line.charAt(i) == '.' && Character.isDigit(line.charAt(i+1)))
break; //a float
else{ line.insert(i-1, split); line.insert(i+1, split);
}
}
}//for
return line.toString();
}

解决方案 »

  1.   

    要是用Scanner又应该怎么写
    public String formater(String input, char split){
    Scanner s = new Scanner(input);

    //Scanner s = new Scanner(input).useDelimiter("(<>)|(<=)|(>=)|(:=)|\\p{Punct}");


    //s.findInLine("(<>)|(<=)|(>=)|(:=)|\\p{Punct}");
    MatchResult result = s.match();
    for(int i = 1; i < result.groupCount(); i++) //Capturing groups 
    System.out.println(result.group(i));
    //input.replace(result.group(i), " " + result.group(i) + " ");
    s.close();
    return input;
    }
    D:\词法分析>java Lexemer "b<>1"
    <>
    null
    null
    b<>1
    为什么有两个null或者抛异常
    Exception in thread "main" java.lang.NullPointerException
            at java.lang.String.replace(Unknown Source)
            at Tokener.formater(Lexemer.java:135)
            at Lexemer.main(Lexemer.java:248)
      

  2.   

    >> to lz, 你的程序我试着改了一下,觉得有以下几个问题
    1. line.capacity() != line.length(), 你把capacity()的含义没弄明白,
    2.for(int i = 0; i<=line.capacity(); i++){ 这样的错误也敢犯??
    3.词法分析时,目标串的开始和结尾符是不是需要单独处理比较好?
    4.循环的次数靠line.length()控制,可你在循环内部动态地改变了line的长度,这很容易造成ArrayOutOfBoundsException 或死循环
    5.循环内有明显的数组越界错误,
    像 line.insert(i-1, split); line.insert(i+2, split);在i=0 i=line.length()的时候程序就疯了,
    5.改了好长一会,还是不明白你的意思,没信心了,你自已看着办吧,我改了一部分,
    import java.lang.*;
    import java.util.*;
    import java.io.*;public class StrFor {
    private boolean isPunct(char c) {
    if(c>=33&&c<=47 || c>=58&&c<=64 || c>=123&&c<=126) // 不明白什么意思?
    return true;
    else 
    return false;
    } public String formater(String s, char split) {
    StringBuilder line = new StringBuilder(s); //目标串
    StringBuilder line2 = new StringBuilder(s);
    System.out.println(line.length());
    int pos = 0; //偏移量
    for(int i = 1; i<line.length()-1; i++) {
    if(isPunct(line.charAt(i))) {
    System.out.println(line.charAt(i));
    if(isPunct(line.charAt(i+1))) {//double punctuations
    //line.insert(i-1, split);
    //line.insert(i+2, split); line2.insert(i - 1 + pos, split);
    line2.insert(i + 2 + pos, split);
    pos += 2; //line2 长度加2
    }
    else if (line.charAt(i) == '.' &&  Character.isDigit(line.charAt(i+1)))
    break; //a float
    else {
    //line.insert(i-1, split);
    //line.insert(i+1, split);
    line2.insert(i - 1 + pos, split);
    line2.insert(i + 1 + pos, split);
    pos += 2;

    }
    System.out.println(i + " null " + line.charAt(i));
    }//for
    return line.toString();
    } public static void main(String[] args) { 
    StrFor sf = new StrFor();
    String sou = "a=b,c=d,e=123.5,string.getchar()";
    String tar = sf.formater(sou, '#');
    System.out.println(tar);
    }
    }
      

  3.   

    re = str.replaceAll("(\\w+)=(\\w+|\\d*(\\.\\d+)?)","$1 = $2").replaceAll("\\.(\\w+)"," . $1");
      

  4.   

    楼上的很强!
    高手说答案,往往只有一句话。我再抛块砖头, 为什么不试一下StringTokenizer?
      

  5.   

    有了正则表达式, 一般就很少需要使用StringTokenizer了...
      

  6.   

    a = a.replaceAll("\\+"," \\+ ").replaceAll("\\-"," \\- ");