Java给字符串替换几个词文本...急,高手来吧...

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java给字符串替换几个词文本...急,高手来吧...相关的知识,希望对你有一定的参考价值。

实现函数
static public String pasteTemplate(String tpl,String params[]);
参数tpl是一段文本, 比如"Hello 0, 1"
参数params是一个字符串数组, 比如"Mike","world"
替换符号为整数,返回替换后的结果"Hello Mike, world"
替换数量从0开始,长度不定且与params中的字串数量相等。
当处理中发现长度不等时,提示错误。发现abc,等不规则占位符号时,不替换,原样输出。

不许用泛型<T>, 不许用StringBuilder,‘Arrays’, Collection/Collections类
但可以用Vector,Stack, Hashtable, StringBuffer.
优选算法效率好的做法!其他细节不清楚请回问..

参考技术A //代码在JDK1.3环境中测试正常.请给分.

package com.ben.util;

public final class PasteTemplate
private final String[] params;//参数
private final StringBuffer result;//结果缓存

private PasteTemplate(String[] params)
super();
this.params = params;
this.result = new StringBuffer();

/**
* 提供外部方法
* @param tpl
* @param params
* @return
*/
public static String pasteTemplate(String tpl, String[] params)
PasteTemplate pasteTemplate = new PasteTemplate(params);
pasteTemplate.execute(tpl, 0);
return pasteTemplate.result.toString();

/**
* 是否是数字
* @param c
* @return
*/
private static final boolean isNum(char c)
return c < 58 && c > 47;

/**
* 核心执行方法
* @param source 源
* @param begin 解析开始位置
* @return
*/
private final boolean execute(String source, int begin)
if (begin + 5 > source.length())
result.append(source.substring(begin));
return false;

char c = source.charAt(begin++);

if (c == '') // 有可能是
c = source.charAt(begin++);

if (c == '') // 第二个
c = source.charAt(begin++);
// 如果是数字
if (isNum(c))
StringBuffer numString = new StringBuffer(4);// 保存数字
numString.append(c);
boolean isZoro = '0' == c;
// 查找下一个''位置
while (true)
c = source.charAt(begin++);
if (isNum(c) && !isZoro)
numString.append(c);
else
if (c == '')
c = source.charAt(begin++);
if (c == '')
int number = Integer.parseInt(numString
.toString());
if (number < params.length)
result.append(params[number]);
else
// throw new RunTimeException("参数长度不等");
result.append("!未找到参数[" + numString
+ "]!");

return execute(source, begin);
else
result.append("").append(numString)
.append("");
return execute(source, begin - 1);

else
result.append("").append(numString);
return execute(source, begin - 1);



else
result.append("");// 加上
return execute(source, begin - 1);

else
result.append('');// 加上第一个
return execute(source, begin - 1);

else
result.append(c);
return execute(source, begin);


/**
* main
* @param args
* @throws Throwable
*/
public static void main(String[] args) throws Throwable
String source = "aaa,00,a02aaa,1a,1,2a--a6";
String result = pasteTemplate(source,
new String[] "我", "爱", "人", "民" );
System.out.println(result);

追问

谢谢!很不错。递归是不是受栈大小限制.

追答

你的满意答案没有我的效率高。

追问

谢谢,再看了看,你这个也很好,可用。
你和中选的效率一样的呀。中选答案在未找到123时也会直接跳过,
你答案不能识别0这样合法的符号。
中选答案没有用递归(递归受栈限制不断增大,每层8个字节)处理长于20个的字符串内存占用反而较小
中选答案有很大的扩展性,改2个数字就能在、、、任意多的标识符中切换。
综合所以觉得中选更适合我。

追答

好的。

参考资料:纯手工打造,请珍惜

参考技术B public static String pasteTemplate(String tpl,String[] params)
int num=tpl.replace("", "@").split("@").length-1;
String l=tpl.replace("", "").replace("", "");
try
if(num!=params.length)
return tpl;
else
for (int i = 0; i < params.length; i++)
String a=""+i;
if(l.contains(a))//这里做判断是否包涵指定字符
l=l.replace(a, params[i]);
else
throw new Exception();


return l;

catch (Exception e)
//e.printStackTrace();
return tpl;


public static void main(String[] args)
String a="Hello 0, 1";
String[] b="Mike","world";
System.out.println(pasteTemplate(a,b));//结果:Hello Mike, world

String a="Hello 0, 1.2";
String[] b="Mike","world";
System.out.println(pasteTemplate(a,b));//结果Hello 0, 1.2

String a="Hello 0, 1.q";
String[] b="Mike","world","The world is mine!";
System.out.println(pasteTemplate(a,b));//结果:Hello 0, 1.q原样输出
追问

谢谢,是我要求不全。
不能用正则replace和正则split...
多次替换的效率不太好。。

参考技术C 露一手手写正则吧。只用了StringBuffer和Integer,Java ME下通过。
static private boolean matchPattern(
final char ch[], int pos, final StringBuffer groups[])

if(ch[pos]!='') return false;
groups[0].setLength(0);
groups[1].setLength(0);
int c=0;
do
groups[0].append(ch[pos]);
pos++; c++;
if(pos>=ch.length) return false;
while(c<2 && ch[pos]=='');

if(c<2 || !Character.isDigit(ch[pos]) ) return false;
c=0;
do
groups[0].append(ch[pos]);
groups[1].append(ch[pos]);
pos++; c++;
if(pos>=ch.length) return false;
while( Character.isDigit(ch[pos]) );

if( ch[pos]!='') return false;
c=0;
do
groups[0].append(ch[pos]);
pos++; c++;
while(pos<ch.length && c<2 && ch[pos]=='');
if(c<2) return false;
return true;

static public String parseTemplate(String tpl,String params[])
char ch[]=tpl.toCharArray();
StringBuffer
out=new StringBuffer(ch.length),
groups[]= new StringBuffer(5), new StringBuffer(3);

for(int i=0;i<ch.length;i++)
int n;
if(matchPattern(ch, i, groups) &&
(n=Integer.parseInt(groups[1].toString()) )<params.length)
out.append(params[n]);
i+=groups[0].length()-1;
else out.append(ch[i]);

return out.toString();

....
...
String a[]=
"5hello 1 你02,小2",
"0s haha 0 1a ",
"heh1 2500",
"heh12500",
;
String p[]="好","world","强";
for(int i=0;i<a.length;i++)
System.out.println(a[i]+" => "+parseTemplate(a[i], p));
===============
5hello 1 你02,小2 => 5hello world 你好强,小强
0s haha 0 1a => 0s haha 好 1a
heh1 2500 => hehworld 强500
heh12500 => hehworld强500本回答被提问者采纳
参考技术D 用jdk中自带的java.text.MessageFormat类就行了,具体自行阅读JDK API文档即可追问

不能用这个类,Java ME环境没有这个库

急,急,急!!!!C语言判断输入的两个操作数数是不是是数字。(可以为负数),望高手赐教,不胜感激!!!

C语言判断输入的两个操作数数是否是数字。(可以为负数)

比如
#include "stdio.h"
void main()

double num1,num2,result;
char op;
printf("Please input an expression.Ex:1+2");
input:scanf("%f%c%f",&num1,&op,&num2);
if(//就是这里如何判断呢?判断它如果是数字,就进行运算,可以为负数)

switch(op)

case '+': result=num1+num2;
break;
case '-':result=num1-num2;

break;
case '*':result=num1*num2;

break;
case '/':
if(num2!=0)

result=num1/num2;

else
printf("error,input again:");
fflush(stdin);
goto input;
break;
case '%': if(num2!=0)

result=(int)num1%(int)num2;

else
printf("error,input again:");
fflush(stdin);
goto input;
break;

printf("%.2lf%c%.2lf=%.2lf",num1,op,num2,result);
goto input; //让程序可以不断执行

else

printf("Error expression,the operator must be numbers!,try again:");
fflush(stdin);
goto input;

加上库函数包含文件#include<ctype.h>
判断函数是这个isdigit(),括号内为变量,是数字返回值为真,不是则为假

应该不能,抱歉。这个函数是字符判断函数,分析其ascii码是否在48到57之间,也就是0到9.

如果要实现你所说的,还要再多写一些函数。
对了,用数字转字符串函数,然后在一一判断书不是数字一级负号。
参考技术A 这里的num1和num2是双精度数据类型的变量,你按照%f格式读入数据,无论你输入的数据是什么,系统都是按数值读进来的,只是如果你给的数据类型不对,读进来的数据值是错误的,但是在num1,num2变量当中的内容一定数值,这是不用判断的。
可能你可以判断一下op中的内容是不是+-*/?
参考技术B //判断输入的函数
int keyinput()

char input[20]; //定义字符串接收输入,输入字符也不会错
int i=0;

scanf("%s",input); //接收输入

for(i;i<strlen(input);i++) //strlen 函数在 string.h
//isdigit 函数在 ctype.h 在vc++6.0中 isdigit() 如果是数字返回4
if(isdigit(input[i])!=4)
return 9999;//如果不是数字返回 9999 (这个自己定)

return atoi(input);//返回输入的值


说明:以上代码为代码段,如果使用的引用 (在文件最上方加上:#include “ctype.h” #include"string.h");
引用此函数,只用 调用 " 定义的int 型变量=keyint() "即可;

参考资料:自产

以上是关于Java给字符串替换几个词文本...急,高手来吧...的主要内容,如果未能解决你的问题,请参考以下文章

java提取最后一个字符,怎么弄啊!急急急

java 格式化日期出现问题,求高手,急

急急急!!!! 怎样用Java读取EXCEl

急!!!高手进,IE网页文本框不能获得焦点,无法输入,查看版本提示出错,

java 替换文本中的所有指定的字符串,比如#*替换为sq, #**替换为we, 我使用了replaceAll进行的替换

java做的restful通过(API key或者token)认证方式的代码是怎样的?最好能提供例子,坐等高手回答,急急急!