簡體   English   中英

在Java中使用正則表達式刪除匹配的字符串

[英]Remove matching String using regular Expression in java

這是我的代碼,請檢查。 最后,我要刪除列表樣式圖像: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);
    }
}

這是對問題標題的一般回答; 它可能無法直接解決問題的細節。 假設我們有一個名為PATTERN的字符串和一個名為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”。

稍作調整,我們就可以概括上述內容,以數組元素替換每個后續匹配項,從而使其真正通用。

對我來說很好

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;

我將刪除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; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM