Java Regex Problem - PullRequest
       1

Java Regex Problem

1 голос
/ 27 июля 2010

У меня есть строка, из которой я пытаюсь извлечь шаблоны, строка выглядит следующим образом:

(  ELT2N ( ELTOK wpSA910 wpSA909 wpSA908 wpSA474 ) )

Проблема в том, что я не знаю, сколько будет строк, начинающихся с 'wp'в строке я пытаюсь найти, однако я хочу, чтобы они извлекли все из них с помощью одного оператора.В настоящее время я использую шаблон ниже:

private final static String STARS_LINE_PATTERN = "\\(\\s+?(\\w+?)\\s+?\\(\\s+(\\w+)\\s+?(\\w+?\\s??){1,}\\s+?\\)\\s+?\\)";

Шаблон соответствует строке и возвращает строки 'ELT2N' и 'ELTOK', но не возвращает строки с префиксом 'wp'.

Кто-нибудь может помочь?

Спасибо

Симон

Ответы [ 4 ]

0 голосов
/ 27 июля 2010

Java regex, как и большинство разновидностей, может сохранять последний захват только при повторении группы захвата.

Для этой конкретной проблемы вам может потребоваться сопоставить всю последовательность wp в одной группе в одном регулярном выражении, а затем снова обработать ее с другим регулярным выражением. В этом случае достаточно простого split.

Вот фрагмент для иллюстрации идеи:

    import java.util.regex.*;
    import java.util.*;
    //...

    String text = "(  ELT2N ( ELTOK wpSA910 wpSA909 wpSA908 wpSA474 ) )";
    String regex =
        "< (word) < (word) ((?:word )+)> >"
            .replace(" ", "\\s+")
            .replace("<", "\\(")
            .replace(">", "\\)")
            .replace("word", "\\w+");

    Matcher m = Pattern.compile(regex).matcher(text);
    if (m.find()) {
        System.out.printf("%s; %s;%n%s",
            m.group(1),
            m.group(2),
            Arrays.toString(m.group(3).split("\\s+"))
        );
    }

Указанные выше отпечатки:

ELT2N; ELTOK;
[wpSA910, wpSA909, wpSA908, wpSA474]

Таким образом, вся последовательность wp захвачена \3 шаблона регулярного выражения, который затем split разделяется на части.

Ссылки

Похожие вопросы

0 голосов
/ 27 июля 2010

Как насчет String#split(" wp")?Отбросьте первый результат, и вам нужно будет выдумать последний, но он справится с работой.

0 голосов
/ 27 июля 2010

Было бы проще сделать это вообще без регулярных выражений, например:

0 голосов
/ 27 июля 2010

Комментарий MvanGeest является верным, если вы используете квантификатор в группе захвата, сохраняется только последнее значение.Проще говоря, если вы не знаете, сколько «наборов» существует, тогда весь процесс не может быть выполнен за один шаг.Сначала вы должны сопоставить все предшествующие строки wp в одном шаблоне, чтобы у вас были "ELT2N", "ELTOK", "wpSA910 wpSA909 wpSA908 wpSA474", затем вам пришлось бы анализировать последнюю строку независимо, чтобы отделить другие значения,Я не использовал Java годами и никогда не использовал Java Regex, поэтому я не могу сказать вам точные шаги, но используя шаблон ...

private final static String STARS_LINE_PATTERN = "\\(\\s+?(\\w+?)\\s+?\\(\\s+(\\w+)\\s+?((?:\\w+?\\s??){1,})\\s+?\\)\\s+?\\)";

... должен изначально разбивать строку в PHPЯ бы просто использовал explode, чтобы разделить \ 3 на массив, чтобы получить независимые значения, я уверен, что у вас есть что-то похожее.

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