在一个字符串中的符号两端添加空格

kgo_yoi 2006-11-22 07:46:50

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();
}
...全文
666 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunnauq 2006-11-26
  • 打赏
  • 举报
回复
a = a.replaceAll("\\+"," \\+ ").replaceAll("\\-"," \\- ");
jk88811 2006-11-26
  • 打赏
  • 举报
回复
有了正则表达式, 一般就很少需要使用StringTokenizer了...
sg552 2006-11-26
  • 打赏
  • 举报
回复
楼上的很强!
高手说答案,往往只有一句话。

我再抛块砖头, 为什么不试一下StringTokenizer?
dreamover 2006-11-25
  • 打赏
  • 举报
回复
re = str.replaceAll("(\\w+)=(\\w+|\\d*(\\.\\d+)?)","$1 = $2").replaceAll("\\.(\\w+)"," . $1");
malligator 2006-11-25
  • 打赏
  • 举报
回复
直接说蹭分~
buyaowen 2006-11-23
  • 打赏
  • 举报
回复
用正则表达式吧
wanguanghai 2006-11-23
  • 打赏
  • 举报
回复
正则表达式
success_dream 2006-11-23
  • 打赏
  • 举报
回复
lz,最好自己先调试下,调试中遇到问题在问拉!
luyang1016 2006-11-23
  • 打赏
  • 举报
回复
正则表达式
zhuixun5506 2006-11-22
  • 打赏
  • 举报
回复
>> 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);
}
}

stonegump 2006-11-22
  • 打赏
  • 举报
回复
调试一下不就完了?感觉你这种处理方式不如直接用正则表达式来的方便快捷。
kgo_yoi 2006-11-22
  • 打赏
  • 举报
回复
要是用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)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧