java正在表达式Pattern和Matcher的疑问

zhengyun_an 2008-05-23 03:09:57
String text ="范德萨<IMG alt='' hspace=0 src='D:\\Documents and Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' align=baseline border=0>222<IMG alt='' hspace=0 src='D:\\Documents and Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' align=baseline border=0>fdafdafda");
String regEx="^<\\s*img[^>].*>$";
Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(text);
boolean rs=m.find();
if(rs==true){
System.out.println("Count::::"+m.groupCount());
for(int i=1;i<=m.groupCount();i++){
System.out.println(m.group(i));
}
}
我的本意是从text中把IMG这个标签取出来。但是现在取不出来,请给各位帮帮忙。。。。。
...全文
292 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengyun_an 2008-05-24
  • 打赏
  • 举报
回复
恩,谢谢各位!问题解决了。呵呵
fosjos 2008-05-23
  • 打赏
  • 举报
回复
估计是这个意思吧
Iterator<String> iter = ... ;
StringBuffer newText = new StringBuffer();
while(m.find()){
m.appendReplacement( m.group().replace(m.group(1),iter.next()) );
}
m.appendTail();

拜托楼主一次把话说明白,太折磨人了
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhengyun_an 的回复:]
如何逐个替换src的值吗?
[/Quote]

能说清楚一些吗?我好像没看懂。

能否举个例子,原来是怎么样的,处理后要变成怎么样?
llyzq 2008-05-23
  • 打赏
  • 举报
回复
佩服果子,不光是技术~
zhengyun_an 2008-05-23
  • 打赏
  • 举报
回复
如何逐个替换src的值吗?
thunderclap 2008-05-23
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("<img [^>,<]*>", Pattern.CASE_INSENSITIVE);
  • 打赏
  • 举报
回复
那用这个试试看吧:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

public static void main(String[] args) {
String text = "范德萨 " +
"<IMG alt='' hspace=0 src='D:\\Documents and " +
"Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif'" +
" align=baseline border=0>" +
"222 " +
"<IMG alt='' hspace=0 src='D:\\Documents and " +
"Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' " +
"align=baseline border=0>" +
"fdafdafda";
String regex = "<\\s*img[^>]+src\\s*=\\s*['\"]([^\"'>]+)['\"][^>]*>";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(text);
while(m.find()) {
System.out.println(m.group(1));
}
}
}
thunderclap 2008-05-23
  • 打赏
  • 举报
回复

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternTest {
public static void test1() {
ArrayList<String> imgs = new ArrayList<String>();
// create a Pattern
Pattern p = Pattern.compile("<img [^>]*>", Pattern.CASE_INSENSITIVE);

// create a Matcher and use the Matcher.group(int) method
String candidateString = "范德萨 <IMG alt='' hspace=0 src='D:\\Documents and Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' align=baseline border=0>222 <IMG alt='' hspace=0 src='D:\\Documents and Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' align=baseline border=0>fdafdafda";
// create a helpful index for the sake of output
Matcher matcher = p.matcher(candidateString);
// Find group number 0 of the first find
while (matcher.find()) {
String group = matcher.group(0);
imgs.add(group);
}
System.out.println(imgs);
}

public static void main(String[] args) {
test1();
}
}


这个应该能满足
zhengyun_an 2008-05-23
  • 打赏
  • 举报
回复
我这时候可以逐个替换src的值吗?
  • 打赏
  • 举报
回复
佩服佩服,回复的人都是星光闪耀了,看来也得抽点时间,争取也混个星星.现在还三角呢.
zx8813443 2008-05-23
  • 打赏
  • 举报
回复
学习了
zhengyun_an 2008-05-23
  • 打赏
  • 举报
回复
谢谢各位了。还有如果我想获取group(1)的值是D:\\Documents and Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif
这时我的正则表达式该怎么写??
  • 打赏
  • 举报
回复
下面这个是你的代码为什么会匹配不到的原因,但愿我写的你能看明白 :)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

public static void main(String[] args) {
String text = "范德萨 " + "<IMG alt='' hspace=0 src='D:\\Documents and "
+ "Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif'"
+ " align=baseline border=0>" + "222 "
+ "<IMG alt='' hspace=0 src='D:\\Documents and "
+ "Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' "
+ "align=baseline border=0>" + "fdafdafda";
// 首先,你的表达式写错了
// 1,要从文本中提取数据的话 ^ $ 不能加
// 2,[^>].* 应改为 [^>]*? 因为 [^>] 只表示一个字符,你后面的 .* 才表示多个字符
// 3. [^>]* 是贪婪方式的匹配,即吃掉整个字符串再一个一个地吐出来,每吐一次匹配一次,匹配成功结束,不成功继续吐,以最多的字符进行匹配,呵呵比较贪心
// [^>]*? 是 lazy 方式匹配,从头开始一个一个吃掉字符,每吃一个字符匹配一次,匹配成功结束,不成功继续吃,以最少的字符进行匹配,比较懒
String regEx = "^ <\\s*img[^>].*>$";
Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(text);
// 这样的话只能匹配到一个,如有好多个就不能匹配了,应改为
// while(m.find())
boolean rs = m.find();
if (rs == true) {
System.out.println("Count::::" + m.groupCount());
// 你对 m.groupCount() 的理解是错误的
// 这个的结果是捕获组的数量,即表达式中捕获组 ( ) 的个数
// m.group(1) 表示获得第一组的内容,比如 表达式 ([0-9])([A-Z]),字符串是 $DAF 7A afdasf
// 表达式用 m.groupCount() 得到的是 2,因为有两对括号,
// 整个表达式可以提取到 7A 这个字符串,
// m.group(1) 表示第一对括号所匹配到的“7”,
// m.group(2) 表示第二对括号所匹配到的“A”
// 而 m.group() 或 m.group(0) 表示匹配表达式的整个字符串“7A”
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println(m.group(i));
}
}
}
}


改正后的代码见 3 楼。
kokobox 2008-05-23
  • 打赏
  • 举报
回复
lz 应该感谢我哈,是我把果子找来给你回答的哈,o(∩_∩)o...正则我不熟悉。。。

老紫竹 2008-05-23
  • 打赏
  • 举报
回复
果子太规矩了,呼呼。

令人敬佩!
  • 打赏
  • 举报
回复
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

public static void main(String[] args) {
String text = "范德萨 " +
"<IMG alt='' hspace=0 src='D:\\Documents and " +
"Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif'" +
" align=baseline border=0>" +
"222 " +
"<IMG alt='' hspace=0 src='D:\\Documents and " +
"Settings\\zhengya\\桌面\\图片与hmtl资料\\jsmenu.gif' " +
"align=baseline border=0>" +
"fdafdafda";
String regex = "<\\s*img[^>]*?>";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(text);
while(m.find()) {
System.out.println(m.group());
}
}
}
老紫竹 2008-05-23
  • 打赏
  • 举报
回复
String regEx="^ <\\s*img[^>].*?>$";

增加一个问号就行了!
skyqiang 2008-05-23
  • 打赏
  • 举报
回复
这个不知道...顶一下..

81,090

社区成员

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

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