用算法实现下面这个程序, 有这样一个字符串 HHHHHHHH<a href="/ART/IP%D3%EF%D2%F4.HTM">IP语音 </a>HHHHHH字符串长度是不限的我想对"IP"这个字符串进行替换 , 变成 <font>IP </font> 但对双引号中的文字进行替换 改怎么写变成下面这样HHHHHHHH<a href="/ART/IP%D3%EF%D2%F4.HTM"> <font>IP </font>语音 </a>HHHHHH除了URL中出现的字符以外, 其它的都要进行替换 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请考虑多个关键字替换 如有两个关键字,VoIP,VonageVoIP--> <font>VoIP </font>Vonage ---><font>Vonage </font>String content="VoIP市场<a href="VoIP">充斥</a><a href="Vonage">免费</a>服务Vonage束手无策 Vonage的增长已经停滞"替换成String content="<font>VoIP </font>市场<a href="VoIP">充斥</a><a href="Vonage">免费</a>服务<font>Vonage </font>束手无策<font>Vonage </font>的增长已经停滞" 这个问题比较头痛, 我也遇到过,匹配模板为XXX的字符串往往比较好办不匹配的只有这样的思路:1:先匹配一下你不要求匹配的东东: 如:先把URL中包含IP 的替换为一个唯一的串, XXBBXXX2. 然后将第一步替换后的串, 匹配 IP 并替换成<font>IP </font>3. 最后将XXBBXXX 替换为你IP, 这样才能解决根本问题.有点郁闷~期待楼下高手 public static String replace(String str, String pattern, String replacement) { return str.replaceAll(Pattern.quote(pattern)+"(?![^<]*>)", replacement); } public static void main(String[] args) { String s = "%%%HH%HH<a href=\"/ART/IP%D3%EF%D2%F4.HTM\">IP语音</a>H%HFHHEHH"; s = replace(s, "IP", "<font>IP</font>"); s = replace(s, "H", "[H]"); s = replace(s, "%", "[%]"); System.out.println(s); } wcwtitxu, 能不能帮我解释一下 ?![^<]*> 正则是什么意思, 我知道 ?![^<]不以“<”开头的字符, 但为什么不是 ?![^<].*>呢,直接用一个*就可以了呢? 好贴, 一起学习, 这些是正则表达式非捕获组的概念,搜到一帖,共勉:http://blog.csdn.net/lovingprince/archive/2008/08/06/2774819.aspx public class SplitDemo { private static String REGEX = "(VoIP|Vonage)(?!')"; private static String INPUT = "VoIP市场 <a href='VoIP'>充斥 </a> <a href='Vonage'>免费 </a>服务Vonage束手无策 Vonage的增长已经停滞"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); INPUT = m.replaceAll("<font>$1</font>"); System.out.println(INPUT); }} [^<] 不是 '<' 的其它任意字符[^<]* 任意个非 '<' 的字符[^<]*> 任意个 非 '<' 的字符 加一个 '>'比如:IP(?![^<]*>) 匹配 "IP" 但多一个条件, 就是 IP 后面不能是任意个非'<'的字符加'>'也就是说,匹配到的"IP" 后面如果出现 '>' 就必须先出现 '<'用意是,限制 "IP" 不被包括于 <....> 里面这样写可能还不够严瑾,在一些不规范的 HTML 中,有可能匹配不准确.但一般这样可以了.写完善了,效率又不好 FileWriter问题 java.util.Comparator和java.lang.Comparable这两个接口有什么不同? java 控制鼠标指针 实现移动 点饥 java中关于内部类的一些问题,请高手帮忙解释下! java版的QQ现在还有能的么? UDP例子得一点问题 java多线程阻塞问题 java qq 群 23475675 java有没有"析构"函数呢? 一个并发的例子,感觉对学习并发基础很有用 repaint重绘 关于Timer定时器的一个疑问
VoIP--> <font>VoIP </font>
Vonage ---><font>Vonage </font>String content="VoIP市场<a href="VoIP">充斥</a><a href="Vonage">免费</a>服务Vonage束手无策 Vonage的增长已经停滞"
替换成String content="<font>VoIP </font>市场<a href="VoIP">充斥</a><a href="Vonage">免费</a>服务<font>Vonage </font>束手无策<font>Vonage </font>的增长已经停滞"
2. 然后将第一步替换后的串, 匹配 IP 并替换成<font>IP </font>3. 最后将XXBBXXX 替换为你IP, 这样才能解决根本问题.
有点郁闷~期待楼下高手
public static String replace(String str, String pattern, String replacement) {
return str.replaceAll(Pattern.quote(pattern)+"(?![^<]*>)", replacement);
}
public static void main(String[] args) {
String s = "%%%HH%HH<a href=\"/ART/IP%D3%EF%D2%F4.HTM\">IP语音</a>H%HFHHEHH"; s = replace(s, "IP", "<font>IP</font>");
s = replace(s, "H", "[H]");
s = replace(s, "%", "[%]");
System.out.println(s);
}
我知道 ?![^<]不以“<”开头的字符, 但为什么不是 ?![^<].*>呢,直接用一个*就可以了呢?
public class SplitDemo {
private static String REGEX = "(VoIP|Vonage)(?!')";
private static String INPUT = "VoIP市场 <a href='VoIP'>充斥 </a> <a href='Vonage'>免费 </a>服务Vonage束手无策 Vonage的增长已经停滞";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll("<font>$1</font>");
System.out.println(INPUT);
}
}
[^<]* 任意个非 '<' 的字符
[^<]*> 任意个 非 '<' 的字符 加一个 '>'
比如:
IP(?![^<]*>) 匹配 "IP" 但多一个条件, 就是 IP 后面不能是任意个非'<'的字符加'>'
也就是说,匹配到的"IP" 后面如果出现 '>' 就必须先出现 '<'用意是,限制 "IP" 不被包括于 <....> 里面这样写可能还不够严瑾,在一些不规范的 HTML 中,有可能匹配不准确.
但一般这样可以了.写完善了,效率又不好