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

3 回答 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; 
于 2012-09-10T12:32:40.250 回答
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"。

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

于 2017-11-07T14:31:26.713 回答
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;
于 2012-09-10T12:27:27.213 回答