在Java中使用正则表达式删除匹配的字符串

3
这是我的代码,请检查。最后我想从字符串中删除 list-style-image: url(images/dot.gif);。
String temp = "font-family: Arial, Helvetica, sans-serif;font-size: 11px;color: F143F;list-style-image: url(images/dot.gif);list-style-type: none;"; 

Pattern pxPattern = Pattern.compile("([a-z]+-)+([a-z]+):(\\s)url\\(.*?\\);");

Matcher pxMatcher = pxPattern.matcher(temp);

while(pxMatcher.find()) {
    System.out.println(pxMatcher.group());
    String urlString =pxMatcher.group();
    if(!urlString.matches("http://|https://")) {
        System.out.println("Firts: "+temp.trim());
        System.out.println(urlString);
        System.out.println(temp.replaceAll(urlString, ""));
        //System.out.println("Remove: "+temp);
    }
}

字符串 temp = "font-family: Arial, Helvetica, sans-serif;font-size: 11px;color: F143F;list-style-image: url(images/dot.gif);list-style-type: none;"; 我想要移除匹配的字符串。 - Milan Thummar
3个回答

4
我会按照以下方式删除list-style-image(不使用while循环,可以在一行中完成):
temp.replaceAll("list-style-image:[^;]+;?", "");

解释一下:

  • 这个代码会寻找 list-style-image,
  • 然后是一个或多个不是分号的字符
  • 然后是一个可选的分号

这将会删除你字符串中间和结尾处的 list-style-image 属性。

结果:

font-family: Arial, Helvetica, sans-serif;font-size: 11px;color: F143F;list-style-type: none; 

这节省了很多时间,而且比循环好的解决方案。我喜欢它。 - user2025527

3

这是对标题问题的一般回答;它可能不直接解决问题的具体细节。假设我们有一个名为PATTERN的字符串和一个名为body的字符串。那么我们可以按照以下方式从body中删除所有匹配的PATTERN:

StringBuilder builder = new StringBuilder();
int x = 0;
Matcher m = Pattern.compile(PATTERN).matcher(body);
while (m.find()) {
  builder.append(body.substring(x, m.start()));
  x = m.end();
}
return(builder.toString());

例如,如果PATTERN =“XOX”且body =“Hello XOXWorldXOX”,则我们应该得到“Hello World”。
工作原理:遍历每个匹配项,在字符串中记录上一个匹配项后面的索引,并将从该索引到当前匹配项开头的子字符串添加到字符串构建器中,然后跳过索引超过当前匹配项的结尾。最后,构建字符串。
注意:beny23的答案更适合从字符串中删除正则表达式。但是,通过小修补,可以使上述代码更加通用。它可以更改为将正则表达式的每个后续出现替换为唯一的替换字符串。这比replaceAll更强大和通用,但这是一个奇怪的特例,可能不经常出现。仍然,为了向您展示我的意思,假设我们想要将第一个匹配项替换为“match_1”,第二个匹配项替换为“match_2”等等,我们可以这样做:
StringBuilder builder = new StringBuilder();
int x = 0;
int matchNumber = 1;
Matcher m = Pattern.compile(PATTERN).matcher(body);
while (m.find()) {
  builder.append(body.substring(x, m.start()));
  builder.append("match_" + matchNumber);
  x = m.end();
}
return(builder.toString());

例如,如果PATTERN = “XOX”,body =“Hello XOXWorldXOX”,那么我们应该得到“Hello match_1Worldmatch_2”。
通过一些微调,我们可以将上述方法推广到用数组元素替换每个后续匹配,使其真正通用。

1

这对我来说很好用

while(pxMatcher.find()) {
    System.out.println(pxMatcher.group());
    String urlString =pxMatcher.group();
    if(!urlString.matches("http://|https://")) {
        System.out.println("Firts: "+temp.trim());
        System.out.println(urlString);
        temp = temp.replace(urlString, "");
        System.out.println("Remove: "+temp);
     }
}

结果是

list-style-image: url(images/dot.gif);
Firts: font-family: Arial, Helvetica, sans-serif;font-size: 11px;color: F143F;list-style-image: url(images/dot.gif);list-style-type: none;
list-style-image: url(images/dot.gif);
Remove: font-family: Arial, Helvetica, sans-serif;font-size: 11px;color: F143F;list-style-type: none;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接