Regex: извлечь строку из строки

1

Мне нужно регулярное выражение, которое позволяет извлечь часть из String. Я получаю эту строку, анализируя XML-документ с DOM. Затем я ищу часть "§regex" в этой строке, и теперь я пытаюсь извлечь ее. например "([A-ZÄÖÜ] {1,3} [-] [AZ] {1,2} [1-9] [0-9] {0,3}) от остальных.

Проблема в том, что я не знаю, как убедиться, что извлеченная часть заканчивается символом "). Это регулярное выражение должно работать для каждого заданного значения. Цель состоит в том, чтобы написать только значение в скобках после "§regex =", включая скобки в строку.

<UML:TaggedValue tag="description" value=" random Text §regex=([A-ZÄÖÜ]{1,3}[- ][A-Z]{1,2}[1-9][0-9]{0,3}) random text"/>

private List<String> findRegex() {
    List<String> forReturn = new ArrayList<String>();
    for (String str : attDescription) {
        if (str.contains("§regex=")) {
            String s = str.replaceAll(regex);
            forReturn.add(s);
        }
    }
    return forReturn;
}

attDescription - это список, содержащий все атрибуты, найденные в анализируемом XML-документе.

До сих пор я пробовал это регулярное выражение: ".*(§regex=)(.*)[)$].*", "$2" но это отключает ")" и не удаляет текст infront искомой части. Даже с помощью этого http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html я действительно не понимаю, как получить то, что мне нужно.

  • 0
    Вы должны предоставить несколько примеров сопоставляемых строк и ожидаемого результата без этого странного украшения §regex. Фрагмент кода сбивает с толку - что такое регулярное выражение?
  • 0
    Довольно ограниченно предполагать, что регулярное выражение не будет иметь групп захвата, групп захвата, буквальных паренов или пробелов. Так что, похоже, если вы не можете знать структуру текста, который следует за ним, я не понимаю, как вы можете это сделать. Возможно, регулярное выражение также может заканчиваться =regex[squiggle] . Тогда у вас будет четкий разделитель для поиска. У вас есть контроль над входом таким образом? (Я бы также подумал о том, чтобы использовать более стандартный символ, кроме того, что в загонах).
Показать ещё 3 комментария
Теги:

2 ответа

2
Лучший ответ

Кажется, это работает для меня (с этим примером в любом случае), если я использую это вместо String s = str.replaceAll(regex);

String s = str.replaceAll( ".*§regex=(\\(.*\\)).*", "$1" );

Он просто ищет подстроку, заключенную в круглые скобки, следующую за §regex=.

  • 0
    Большое спасибо! Сейчас работает отлично.
0

Это похоже на работу:

String s = str.replaceAll(".*§regex=\\((.*)[)].*", "$1");

Заметка:

  • Выйти из ведущей скобки
  • $ Внутри символьного класса является литералом $ - игнорировать его, потому что ваше регулярное выражение всегда должно заканчиваться скобкой
  • Нет необходимости фиксировать фиксированный текст

Тестовый код, отмечая, что это работает с скобками в/вокруг регулярного выражения:

String str = "random Text §regex=(([A-ZÄÖÜ]{1,3}[- ][A-Z]{1,2}[1-9][0-9]{0,3})) random text";
String s = str.replaceAll(".*§regex=\\((.*)[)].*", "$1");
System.out.println(s);

Вывод:

([A-ZÄÖÜ]{1,3}[- ][A-Z]{1,2}[1-9][0-9]{0,3})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню