Java RegEx для замены строки, где начальная и конечная части соответствуют определенному шаблону - PullRequest
2 голосов
/ 30 декабря 2011

Привет, мне нужно написать регулярное выражение в Java, которое найдет все экземпляры:

wsp:rsidP="005816D6" wsp:rsidR="005816D6" wsp:rsidRDefault="005816D6" 

атрибуты в строке XML и их удаление:

Так что мне нужно удалить все атрибуты, которые начинаются с wsp:rsid и заканчиваются двойной кавычкой (")

Мысли на это:

  1. String str = xmlstring.replaceAll("wsp:rsid/w", "");
  2. String str = xmlstring.replaceAll("wsp:rsid[]\\"", "");

Ответы [ 4 ]

2 голосов
/ 30 декабря 2011
xmlstring.replaceAll( "wsp:rsid\\w*?=\".*?\"", "" );

Это работает в моих тестах ...

public void testReplaceAll() throws Exception {
    String regex = "wsp:rsid\\w*?=\".*?\"";

    assertEquals( "", "wsp:rsidP=\"005816D6\"".replaceAll( regex, "" ) );
    assertEquals( "", "wsp:rsidR=\"005816D6\"".replaceAll( regex, "" ) );
    assertEquals( "", "wsp:rsidRDefault=\"005816D6\"".replaceAll( regex, "" ) );
    assertEquals( "a=\"1\" >", "a=\"1\" wsp:rsidP=\"005816D6\">".replaceAll( regex, "" ) );
    assertEquals(
            "bob   kuhar",
            "bob wsp:rsidP=\"005816D6\" wsp:rsidRDefault=\"005816D6\" kuhar".replaceAll( regex, "" ) );
    assertEquals(
            " keepme=\"yes\" ",
            "wsp:rsidP=\"005816D6\" keepme=\"yes\" wsp:rsidR=\"005816D6\"".replaceAll( regex, "" ) );
    assertEquals(
            "<node a=\"l\"  b=\"m\"  c=\"r\">",
            "<node a=\"l\" wsp:rsidP=\"0\" b=\"m\" wsp:rsidR=\"0\" c=\"r\">".replaceAll( regex, "" ) );
    // Sadly doesn't handle the embedded \" case...
    // assertEquals( "", "wsp:rsidR=\"hello\\\"world\"".replaceAll( regex, "" ) );
}
1 голос
/ 30 декабря 2011

Попробуйте:

xmlstring.replaceAll("\\bwsp:rsid\\w*=\"[^\"]+(\\\\\"[^\"]*)*\"", "");

Кроме того, ваши регулярные выражения неверны. Я предлагаю вам пойти и пахать через http://regular -expressions.info ;)

0 голосов
/ 31 декабря 2011

В отличие от всех других ответов, этот ответ действительно работает!

xmlstring.replaceAll("\\bwsp:rsid\\w*?=\"[^\"]*\"", "");

Вот тест, который не проходит со всеми другими ответами:

public static void main(String[] args) {
    String xmlstring = "<tag wsp:rsidR=\"005816D6\" foo=\"bar\" wsp:rsidRDefault=\"005816D6\">hello</tag>";
    System.out.println(xmlstring);
    System.out.println(xmlstring.replaceAll("\\bwsp:rsid\\w*?=\"[^\"]*\"", ""));
}

Выход:

<tag wsp:rsidR="005816D6" foo="bar" wsp:rsidRDefault="005816D6">hello</tag>
<tag  foo="bar" >hello</tag>
0 голосов
/ 30 декабря 2011

Здесь 2 функции. clean выполнит замену, extract извлечет данные (если вы этого хотите, не уверены)

Пожалуйста, извините за стиль, я хотел, чтобы вы могли вырезать и вставлять функции.

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Answer {

    public static HashMap<String, String> extract(String s){
        Pattern pattern  = Pattern.compile("wsp:rsid(.+?)=\"(.+?)\"");
        Matcher matcher = pattern.matcher(s);
        HashMap<String, String> hm = new HashMap<String, String>();

        //The first group is the string between the wsp:rsid and the =
        //The second is the value
        while (matcher.find()){
            hm.put(matcher.group(1), matcher.group(2));
        }

        return hm;
    }

    public static String clean(String s){
        Pattern pattern  = Pattern.compile("wsp:rsid(.+?)=\"(.+?)\"");
        Matcher matcher = pattern.matcher(s);
        return matcher.replaceAll("");
    }

    public static void main(String[] args) {

        System.out.print(clean("sadfasdfchri wsp:rsidP=\"005816D6\" foo=\"bar\" wsp:rsidR=\"005816D6\" wsp:rsidRDefault=\"005816D6\""));
        HashMap<String, String> m = extract("sadfasdfchri wsp:rsidP=\"005816D6\" foo=\"bar\" wsp:rsidR=\"005816D6\" wsp:rsidRDefault=\"005816D6\"");
        System.out.println("");

        //ripped off of http://stackoverflow.com/questions/1066589/java-iterate-through-hashmap
        for (String key : m.keySet()) {
            System.out.println("Key: " + key + ", Value: " + m.get(key));
        }

    }   

}

возвращается:

sadfasdfchri  foo="bar"

Key: RDefault, Value: 005816D6

Key: P, Value: 005816D6

Key: R, Value: 005816D6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...