如
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();
}
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();
}
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)
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);
}
}
高手说答案,往往只有一句话。我再抛块砖头, 为什么不试一下StringTokenizer?