一个有点难度的字符串替换问题,解决或提示都给分----在线等待 to luojx(大鱼儿):能给个例子么,谢谢啦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关于第二个问题:是不是可以把用户输入的内容提取出来再进行处理替换或者直接进行替换如下:newStr=newStr.replaceAll("[url ","<a ");newStr=newStr.replaceAll("[url]","</a>"); to stonecsdn(东东):因为这些标记是混在帖子内容中的,而且可能会有多个。如果要提取标记间的内容好像不太行啊。而直接替换就不能对其完整性进行判断了 to littish(P.Moon):?你什么时候也开始搞JAVA啦? to littish(P.Moon):按你的说法,其实还是要多次遍历整个文本的,而且还多了个拆分合并的工作啊 XP:超长文本,假设遍历全部使用10M内存,拆分成10份再合并,内存使用肯定不满10M吧。cgi论坛很多都是只用这种标记的,可以弄个LEO或者UT的版本来看看。 XP:超长文本,假设遍历全部使用10M内存,拆分成10份再合并,内存使用肯定不满10M吧。cgi论坛很多都是使用这种标记的,可以弄个LEO或者UT的版本来看看。NND,这里的论坛不好,自己的帖子都不能修改;还是牛过好玩。 to littish(P.Moon):我比较关心的是代码的执行效率啊PS:这里是专业论坛啊 newStr=cStr.replaceAll("[b]","<b>").replaceAll("[b","<b"); 正则表达式处理字符串效率最高,不过这是通用的情况,如果有特殊的处理或就有一些特定的处理也可自己考虑,不过java的正则表达式很不错推荐使用,而且学会了,以后可以常用 import java.util.regex.*;public class Regex { public Regex() { } public static void main(String[] args) { String res = "[url herf='www.sohu.com']"; String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(res); if (m.matches()) { for (int i = 1; i <= m.groupCount(); i++) { System.out.println(m.group(i)); } } }}得到www.sohu.com自己再拼上前后就可以了 http://expert.csdn.net/Expert/topic/2670/2670979.xml?temp=.5523798我曾经做过的一个例子。希望对你有帮助。btw,replace命令执行是很快的,不像你想象的那么效率低下。 XP,你真行。如果Browser能处理的话,就在Browser处理。 不好意思!“冷血”的例子没有看明白,能在解释一遍吗?String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]";关键是这个语句不明白。 newStr=cStr.replaceAll("[","<>").replaceAll("]",">").replaceAll("url","a");replaceAll本来就是用的正则表达式.应该可以直接用正则表达式匹配所有情况,一次替换完.不过那就要自己看文档了:) newStr=cStr.replaceAll("[","<").replaceAll("]",">").replaceAll("url","a"); String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]";这是正则表达式的表示方法是这么分开的\\s* \\[ url \\s+ herf= \\' (.*) 0个或多个空格 字符[ 字符url 1个或多个空格 字符herf= 字符' .*任意多个字符\\' \\]字符' 字符]连接起来就是String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]"; 楼上只能判断是否符合pattern,如果想要替换怎么办呢?比如:要将[url herf='www.sohu.com']搜狐[/url]替换为:搜狐? 请问楼上各位,好像按大家说的只能是用户的帖子内容里只有一个超连接的情况,而且用户的正文里可能也会出现'['或']',此时就不该替换了。比如用户的正文可能是:今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url] import java.util.regex.*;public class Regex { public Regex() { } public static void main(String[] args) { String res = "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]" + "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]"; int count = 0; String first = ""; String end = ""; String reg = "\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(res); while (m.find()) { int iFirst = m.start(0) - count * 4; first = res.substring(0, iFirst); int iEnd = m.end(0) - count * 4; if (iEnd > res.length()) { end = ""; } else { end = res.substring(iEnd); } res = first + "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>" + end; count++; } System.out.println(res); }}能查找 替换还不容易 TO jokerjava(冷血) :请问int iFirst = m.start(0) - count * 4;和int iEnd = m.end(0) - count * 4;这两句中的count是做什么用的呢?还有就是res在初始化时为什么要把内容再加一遍呢? jokerjava:试了你的程式,循环没有运行,所以没有置换出来请问在那有详细JAVA正则表达式说明?(有中文的吗?) 我理解的对不对:?the "magic number" 4是不是[url herf='www.sohu.com']搜狐[/url]和[a herf='www.sohu.com']搜狐[/a]两者之间的字符数之差?jokerjava(冷血) : pfpf 我理解的对不对:?the "magic number" 4是不是[url herf='www.sohu.com']搜狐[/url]和[a herf='www.sohu.com']搜狐[/a]两者之间的字符数之差?对啊 呵呵 我测试过了 正确的jdk文档挺全的 我也是看的它 大家应该都有 还有就是res在初始化时为什么要把内容再加一遍呢?呵 测试url多的时候 解析有没有问题啊 能不能用replace之类的方法实现呢?这么写好像有点别扭……:) 今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]要是只是这么简单的字符串 replace应该可以如果字符串复杂的话不容易找到标识的找到了也可能是错的用正则最安全 看上去也挺好啊 呵呵,我又找到了篇文档,里面用的是:appendReplacement和appendTail来做的,不知道这样做行不行。地址:http://www.javaresearch.org/article/showarticle.jsp?column=25&thread=7180 to jokerjava(冷血):你后来的表达式用的是"\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]";,怎么星号那里用的不是一开始的(.*)呢 呵呵,我指的是while (m.find()) { int iFirst = m.start(0) - count * 4; first = res.substring(0, iFirst); int iEnd = m.end(0) - count * 4; if (iEnd > res.length()) { end = ""; } else { end = res.substring(iEnd); } res = first + "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>" + end; count++; }这一块儿 import java.util.regex.*;public class Regex { public Regex() { } public static void main(String[] args) { String res = "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]"; int count = 0; String first = ""; String end = ""; String reg = "\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(res); StringBuffer buffer = new StringBuffer(); while (m.find()) { /* int iFirst = m.start(0) - count * 4; first = res.substring(0, iFirst); int iEnd = m.end(0) - count * 4; if (iEnd > res.length()) { end = ""; } else { end = res.substring(iEnd); } res = first + "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>" + end; count++; */ m.appendReplacement(buffer, "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>"); } m.appendTail(buffer); System.out.println(buffer.toString()); //System.out.println(res); }}ok 这个方法好 import java.util.regex.*;public class Regex { public Regex() { } public static void main(String[] args) { String res = "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]"; int count = 0; String first = ""; String end = ""; String reg = "\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(res); StringBuffer buffer = new StringBuffer(); while (m.find()) { m.appendReplacement(buffer, "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>"); } m.appendTail(buffer); System.out.println(buffer.toString()); }}去掉注释好看([^\\[]*) 和 (.*)是有区别的 第一个是除去[的任意字符 第二个是所有的字符 万分感谢jokerjava(冷血)的帮助,不过前面的还没调通新问题又来了:replaceAll("[b]","<b>");怎么得到的结果是字符串中的[b]全变成了[<b>]?为什么“[”和“]”没有被替换掉呢? :( to jokerjava(冷血):([^\\[]*)是除去[的任意字符,那请问如果我想是*中的内容不能包含[/url]这个字符串的话该怎么做呢 虽然最后两个回复提的问题还是不明白,但本帖问题已解决,再次感谢jokerjava(冷血)等朋友们的热心帮助!! 求高手帮忙看一下。。 永远不能这样使用泛型吗? 什么时候需要静态导入? 工作找不到! 来泡论坛了!大家帮我看下这个程序撒! swing小问题 初学者的 二维数组赋值问题 问个关于算法的问题 请教:想在网页中来个计时器,怎么写? 怎么让控件得到焦点? Java Concurrency in Practice安全发布的问题 怎么用package? 为什么IE能浏览我下载的.class文件,而不能看我用jbuilder生成的.class文件
是不是可以把用户输入的内容提取出来再进行处理替换或者直接进行替换如下:
newStr=newStr.replaceAll("[url ","<a ");
newStr=newStr.replaceAll("[url]","</a>");
NND,这里的论坛不好,自己的帖子都不能修改;还是牛过好玩。
public Regex() {
} public static void main(String[] args) {
String res = "[url herf='www.sohu.com']";
String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(res);
if (m.matches()) {
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println(m.group(i));
}
}
}
}
得到www.sohu.com
自己再拼上前后就可以了
我曾经做过的一个例子。
希望对你有帮助。
btw,replace命令执行是很快的,不像你想象的那么效率低下。
如果Browser能处理的话,就在Browser处理。
String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]";关键是这个语句不明白。
replaceAll本来就是用的正则表达式.
应该可以直接用正则表达式匹配所有情况,一次替换完.不过那就要自己看文档了:)
这是正则表达式的表示方法是这么分开的
\\s* \\[ url \\s+ herf= \\' (.*)
0个或多个空格 字符[ 字符url 1个或多个空格 字符herf= 字符' .*任意多个字符\\' \\]
字符' 字符]连接起来就是
String reg = "\\s*\\[url\\s+herf=\\'(.*)\\'\\]";
比如:
要将
[url herf='www.sohu.com']搜狐[/url]
替换为:
搜狐?
比如用户的正文可能是:今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]
public Regex() {
} public static void main(String[] args) {
String res = "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]"
+ "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]";
int count = 0;
String first = "";
String end = "";
String reg = "\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(res);
while (m.find()) {
int iFirst = m.start(0) - count * 4;
first = res.substring(0, iFirst);
int iEnd = m.end(0) - count * 4;
if (iEnd > res.length()) {
end = "";
} else {
end = res.substring(iEnd);
}
res = first + "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>" + end;
count++;
}
System.out.println(res);
}
}
能查找 替换还不容易
请问在那有详细JAVA正则表达式说明?(有中文的吗?)
the "magic number" 4
是不是[url herf='www.sohu.com']搜狐[/url]和
[a herf='www.sohu.com']搜狐[/a]
两者之间的字符数之差?jokerjava(冷血) : pfpf
the "magic number" 4
是不是[url herf='www.sohu.com']搜狐[/url]和
[a herf='www.sohu.com']搜狐[/a]
两者之间的字符数之差?
对啊 呵呵 我测试过了 正确的
jdk文档挺全的 我也是看的它 大家应该都有
不容易找到标识的
找到了也可能是错的用正则最安全 看上去也挺好啊
while (m.find()) {
int iFirst = m.start(0) - count * 4;
first = res.substring(0, iFirst);
int iEnd = m.end(0) - count * 4;
if (iEnd > res.length()) {
end = "";
} else {
end = res.substring(iEnd);
}
res = first + "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>" + end;
count++;
}
这一块儿
public Regex() {
} public static void main(String[] args) {
String res = "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]";
int count = 0;
String first = "";
String end = "";
String reg = "\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(res);
StringBuffer buffer = new StringBuffer();
while (m.find()) {
/*
int iFirst = m.start(0) - count * 4;
first = res.substring(0, iFirst);
int iEnd = m.end(0) - count * 4;
if (iEnd > res.length()) {
end = "";
} else {
end = res.substring(iEnd);
}
res = first + "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>" + end;
count++;
*/
m.appendReplacement(buffer, "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>");
}
m.appendTail(buffer);
System.out.println(buffer.toString());
//System.out.println(res);
}
}ok 这个方法好
public Regex() {
} public static void main(String[] args) {
String res = "今天是我的[birthday],欢迎大家访问我的网站[url herf='www.sohu.com']搜狐[/url]或[url herf='www.sina.com.cn']新浪[/url]";
int count = 0;
String first = "";
String end = "";
String reg = "\\s*\\[url\\s+herf=\\'([^\\']*)\\'\\]([^\\[]*)\\[/url\\]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(res);
StringBuffer buffer = new StringBuffer();
while (m.find()) {
m.appendReplacement(buffer, "<a herf='" + m.group(1) + "'>" + m.group(2)+ "</a>");
}
m.appendTail(buffer);
System.out.println(buffer.toString());
}
}
去掉注释好看([^\\[]*) 和 (.*)是有区别的
第一个是除去[的任意字符 第二个是所有的字符