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等等,字符串中可能有若干图片链接,

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

谢谢
...全文
199 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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);

}



62,634

社区成员

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

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