使用java中的正则表达式删除匹配的String

时间:2012-09-10 12:18:36

标签: java regex string

这是我的代码,请检查。在结束时我想删除list-style-image:url(images / dot.gif);来自String

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);
    }
}

3 个答案:

答案 0 :(得分:2)

这是问题标题的一般答案;它可能无法直接解决问题的具体细节。假设我们有一个名为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());

E.g。如果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());

E.g。如果PATTERN =“XOX”和body =“Hello XOXWorldXOX”那么我们应该回到“Hello match_1Worldmatch_2”。

稍微调整一下,我们可以概括上面的内容,用数组元素替换每个后续匹配,使其真正通用。

答案 1 :(得分: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;

答案 2 :(得分:1)

我会删除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;