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

I would remove the list-style-image as follows (rather than using a while loop, this can be done in one line):

temp.replaceAll("list-style-image:[^;]+;?", "");

To explain:

  • This will look for list-style-image,
  • then one or more characters which aren't a semicolon
  • then an optional semicolon

This will remove the list-style-image attribute from the middle as well as the end of your string.

Result:

font-family: Arial, Helvetica, sans-serif;font-size: 11px;color: F143F;list-style-type: none; 
于 2012-09-10T12:32:40.250 に答える
3

これは、質問のタイトルに対する一般的な回答です。質問の詳細に直接対応していない場合があります。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」に、2 番目の一致を「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 に答える