Java简单正则表达式问题

roman9t 2011-09-14 09:29:51
正则表达式学了忘忘了学太痛苦了,请csdn每天用比较熟悉的同学帮帮忙。

要求:给定html字符串,将图片链接中的文件名中空格去掉

原字符串例子:String s1 = 'ttached muscles. </P><P align=center><IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_ anatomy 1.jpg" width=350 bord'

去除后字符串:String s2 = 'ttached muscles. </P><P align=center><IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.jpg" width=350 bord'

可以确定的是'src="file:///android_asset/images/'肯定存在, 图片链接肯帝有扩展名,有可能是.bmp,.gif,.jpg等等,字符串中可能有若干图片链接,

分不够我可以回帖补.有什么问题可以留言

谢谢
...全文
192 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
albertshaw 2011-09-14
  • 打赏
  • 举报
回复

public static void main(String[] args)
{
String str = "ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ a n a t o m y 1.jpg\" width=350 bord src=\"file:///android_asset/images/e2e_ ana2222omy 2.jpg\" end";
Pattern p = Pattern
.compile("(.*?)(src=\"file:///android_asset/images/)(.*?\\s+.*?)(\")");
Matcher m = p.matcher(str);
StringBuilder sb = new StringBuilder("");
int i = 0;
while (m.find()) {
sb.append(m.group(1)).append(m.group(2)).append(
m.group(3).replaceAll("\\s+", "")).append(m.group(4));
i = m.end();
}
sb.append(str.substring(i, str.length()));
System.out.println(sb.toString());
}

4楼 5楼都有同一个问题, 多加几个空格就能很明显的看出来.
若鱼1919 2011-09-14
  • 打赏
  • 举报
回复

public static void main(String[] args) {
String str = "'ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy 1.jpg\" width=350 bord'";
str += "'ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy 1.jpg\" width=350 bord'";
StringBuffer sb = new StringBuffer(str);
Matcher m = Pattern.compile("(?i)(file:///.*?/)([\\w\\s]+)(\\.\\w+)").matcher(str);
while(m.find()){
sb = sb.replace(m.start(2), m.end(2), m.group(2).replaceAll(" ", ""));
}
System.out.println(sb.toString());
}
shuwei003 2011-09-14
  • 打赏
  • 举报
回复
支持替换多个图片链接:

public static void main(String[] args) {
String str = "ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy 1.jpg\" width=350 bord src=\"file:///android_asset/images/e2e_ ana2222omy 2.jpg";
Pattern p = Pattern.compile("(?<=src=\"file:///android_asset/images/).*?\\s+.*?(?=\\.[bmp|gif|jpg])");
Matcher m = p.matcher(str);
while(m.find()){
int start = m.start();
int end = m.end();
str = str.substring(0, start) + m.group().replaceAll("\\s", "") + str.substring(end,str.length());
}
System.out.println(str);
}
  • 打赏
  • 举报
回复
不用去匹配,去掉空格就行了
public class Regex {


public static void main(String[] args) {
String s="file:///android_asset/images/eye_ anatomy 1.jpg";
String str=s.replaceAll("\\s*","");
System.out.print(str);
}

}
fainfy 2011-09-14
  • 打赏
  • 举报
回复

StringBuilder input = new StringBuilder(
"<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy1.jpg\" width=350 bord' />");
Pattern p = Pattern.compile("(?i)<img.*?src=\".*/(.*)\".*?>");
Matcher m = p.matcher(input);
m.find();

String group = m.group(1);
int start = m.start(1);
int end = m.end(1);

input = input.replace(start, end, group.replaceAll(" ", ""));
System.out.println(input);
大_爱 2011-09-14
  • 打赏
  • 举报
回复
replaceAll 可以不?
albertshaw 2011-09-14
  • 打赏
  • 举报
回复

String str = "\r\n<P align=center>\r\n"
+ "<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy 1 .jpg\" width=350 border=0></P> fd ssda f \r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n";

Pattern p = Pattern.compile(
"(.*?)(src=\"file:///android_asset/images/)(.*?)(\")",
Pattern.DOTALL);
// nanoseconds 2600356

Pattern p = Pattern.compile(
"(.*?)(src=\"file:///android_asset/images/)(.*?\\s+.*?)(\")",
Pattern.DOTALL);
// nanoseconds 6596175


其实也没改啥,尽量降低第一个正则的复杂度而已, 但是这样改以后,凡是src="file:///android_asset/images/..."这种都会对后面的那部分做replaceAll(" ",""),虽然结果不会有变化.
roman9t 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 albertshaw 的回复:]

引用 10 楼 roman9t 的回复:
谢谢这位朋友, 但我用以下字符串测试不对:


Java code

public class reg {
public static void main(String[] args) {
String str = "\r\n<P align=center>\r\n"
+ "<IMG height=286 alt=\"eye_……

……
[/Quote]

谢谢的确好用,但能解决下性能问题么,速度比不替换慢很多很多。。。
albertshaw 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 roman9t 的回复:]
谢谢这位朋友, 但我用以下字符串测试不对:


Java code

public class reg {
public static void main(String[] args) {
String str = "\r\n<P align=center>\r\n"
+ "<IMG height=286 alt=\"eye_……
[/Quote]

你的结果是需要这样么?

/*

<P align=center>
<IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.jpg" width=350 border=0></P> fd ssda f
fd <P align=center><IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.bmp" width=350 border=0></P>

<IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.png" width=350 border=0>
*/


那么只需要将pattern改成dotall就行,如下

Pattern p = Pattern.compile(
"(.*?)(src=\"file:///android_asset/images/)(.*?\\s+.*?)(\")",
Pattern.DOTALL);
fainfy 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 roman9t 的回复:]

谢谢这位同学,不过你的code只能替换一个

引用 2 楼 fainfy 的回复:

Java code

StringBuilder input = new StringBuilder(
"<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy1.jpg\"……
[/Quote]
没错,主要的是想帮助你找到方法。
你虽然在测试中没有任何问题,但是我那个正则表达式并不像楼下朋友写的那么严格。
假设是在一个html页中查找的话,可以会把a标签中的属性也读取出来。
拿到方法自己会跟着需求变化来实现自己的功能,出现问题自己可以找可以改变现有的代码。
若鱼1919 2011-09-14
  • 打赏
  • 举报
回复

public static void main(String[] args) {
String str = "'ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye _ anatomy 1.jpg\" width=350 bord'";
str += "'ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/e ye_ anatomy 1.jpg\" width=350 bord'";
StringBuffer sb = new StringBuffer(str);
Matcher m = Pattern.compile("(?i)(file:///.*?/)(.*?)(\\.\\w+)").matcher(str);
while(m.find()){
sb = sb.replace(m.start(2), m.end(2), m.group(2).replaceAll("\\s*", ""));
}
System.out.println(sb.toString());
}
roman9t 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 goldenfish1919 的回复:]

Java code

public static void main(String[] args) {
String str = "'ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anat……
[/Quote]

谢谢,但也有些问题:

    public static void main(String[] args) {
String str = "\r\n<P align=center>\r\n"
+ "<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy 1 .jpg\" width=350 border=0></P> fd ssda f \r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n";

StringBuffer sb = new StringBuffer(str);
Matcher m = Pattern.compile("(?i)(file:///.*?/)([\\w\\s]+)(\\.\\w+)").matcher(str);
while (m.find()) {
sb = sb.replace(m.start(2), m.end(2), m.group(2).replaceAll(" ", ""));
}
System.out.println(sb.toString());
}



<P align=center>
<IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.jpg" width=350 border=0></P> fd ssda f
fd <P align=center><IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/ eeye_anatomy1p" width=350 border=0></P>

<IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatoeye_anatomy1th=350 border=0>

roman9t 2011-09-14
  • 打赏
  • 举报
回复
谢谢这位朋友, 但我用以下字符串测试不对:

public class reg {
public static void main(String[] args) {
String str = "\r\n<P align=center>\r\n"
+ "<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy 1 .jpg\" width=350 border=0></P> fd ssda f \r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n";

Pattern p = Pattern.compile("(.*?)(src=\"file:///android_asset/images/)(.*?\\s+.*?)(\")");
Matcher m = p.matcher(str);
StringBuilder sb = new StringBuilder("");
int i = 0;
while (m.find()) {
sb.append(m.group(1)).append(m.group(2)).append(m.group(3).replaceAll("\\s+", "")).append(m.group(4));
i = m.end();
}
sb.append(str.substring(i, str.length()));
System.out.println(sb.toString());
}
}


结果为:

<IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.jpg"fd  <P align=center><IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.bmp" width=350 border=0></P>

<IMG height=286 alt="eye_anatomy 1.jpg" src="file:///android_asset/images/eye_anatomy1.png" width=350 border=0>




[Quote=引用 6 楼 albertshaw 的回复:]

Java code

public static void main(String[] args)
{
String str = "ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ a n a t o……
[/Quote]
roman9t 2011-09-14
  • 打赏
  • 举报
回复
谢谢这位同学,不过你的code只能替换一个

[Quote=引用 2 楼 fainfy 的回复:]

Java code

StringBuilder input = new StringBuilder(
"<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy1.jpg\" width=350 bord' />");
Pa……
[/Quote]
shuwei003 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 albertshaw 的回复:]
4楼 5楼都有同一个问题, 多加几个空格就能很明显的看出来.[/Quote]
恩,有些问题,但是问题容易就改掉了,仍然又比较简单的方法

public static void main(String[] args) {
String str = "ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ an a tomy 1.jpg\" width=350 bord src=\"file:///android_asset/images/e2e_ ana2222omy 2.jpg";
Pattern p = Pattern.compile("(?<=src=\"file:///android_asset/images/).*?\\s+.*?(?=\\.[bmp|gif|jpg])");
Matcher m = p.matcher(str);
while(m.find()){
int start = m.start();
int end = m.end();
str = str.substring(0, start) + m.group().replaceAll("\\s", "") + str.substring(end,str.length());
m = p.matcher(str);
}
System.out.println(str);
}
ouotuo 2011-09-14
  • 打赏
  • 举报
回复
alt="eye_anatomy 1.jpg"

楼主这个好像也要替换呢。

去掉空格
	/**
* @param args
*/
public static void main(String[] args) {
String reg = "src=\"file:///android_asset/images/([^\"]+)\"";
Pattern pattern = Pattern.compile(reg);
System.out.println(pattern.toString());

Matcher matcher = pattern
.matcher("ttached muscles. </P><P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_ anatomy 1.jpg\" width=350 bord");

StringBuffer sb = new StringBuffer();

while (matcher.find()) {
String src=matcher.group(0);

matcher.appendReplacement(sb,src.replaceAll("\\s",""));
}
matcher.appendTail(sb);
System.out.println(sb);

}



正则表达式善于处理文本,对匹配、搜索和替换等操作都有意想不到的作用。正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率。 正则表达式应用于程序设计语言中,首次是出现在 Perl 语言,这也让 Perl 奠定了正则表达式旗手的地位。现在,它已经深入到了所有的程序设计语言中,在程序设计语言中,正则表达式可以说是标准配置了。 Java 中从 JDK 1.4 开始增加了对正则表达式的支持,至此正则表达式成为了 Java 中的基本类库,使用时不需要再导入第三方的类库了。Java 正则表达式的语法来源于象征着正则表达式标准的 Perl 语言,但也不是完全相同的,具体的可以参看 Pattern 类的 API 文档说明。 我在一次偶然中发现了位于 java.sun.com 站点上的 Java Tutorial,也在那里看到了关于 Java正则表达式教程,感觉它不同于其他的正则表达式教程,文中以大量的匹配实例来进行说明。为了能让 Java 学习者能更好地使用正则表达式,就将其完整地译出了。该教程中所介绍的正则表达式应用仅仅是最为简单的(并没有完全地涉及到 Pattern 类支持的所有正则表达式语法,也没有涉及到高级的应用),适合于从未接触过或者是尚未完全明白正则表达式基础的学习者。在学习完该教程后,应该对正则表达式有了初步的了解,并能熟练地运用 java.util.regex 包中的关于正则表达式的类库,为今后学习更高级的正则表达式技术奠定良好的基础。 教程中所有的源代码都在 src 目录下,可以直接编译运行。由于当前版本的 Java Tutorial 是基于 JDK 6.0 的,因此其中的示例程序也用到了 JDK 6.0 中的新增类库,但正则表达式在 JDK 1.4 就已经存在了,为了方便大家使用,改写了部分的源代码,源代码类名中后缀为"V4"的表示用于 JDK 1.4 或以上版本,"V5"的表示用于 JDK 5.0 或以上版本,没有这些后缀的类在各个版本中均可以正常使用。 由于译者的水平和技术能力有限,译稿虽经多次校对,难免有疏漏之处,敬请大家批评和指正。若有发现不妥之处,请发送邮件至 FrankieGao123@gmail.com,我会在 blog 中进行勘误,谢谢!

62,612

社区成员

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

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