Извлечение двух строк из цитат в Java с помощью регулярных выражений? - PullRequest
1 голос
/ 12 марта 2011

Я новичок в использовании шаблонов и искал повсюду в Интернете объяснение этой проблемы.

Скажите, у меня есть строка: String info = "Data I need to extract is 'here' and 'also here'";

Как бы мне извлечь слова:

here
also here

без одинарных кавычек с использованием шаблона?

Это то, что я имею до сих пор ...

Pattern p = Pattern.compile("(?<=\').*(?=\')");

Но он возвращает (here and 'also here) минус скобки, то есть только для просмотра. Он пропускает второй фрагмент данных и сразу переходит к последней цитате ...

Спасибо!

EDIT:

Спасибо за ваши ответы всем! Как можно изменить шаблон так, чтобы здесь сохранялся в matcher.group (1), а также здесь сохранялся в matcher.group (2)? Мне нужны эти значения по разным причинам, и разделение их на 1 группу представляется неэффективным ...

Ответы [ 4 ]

3 голосов
/ 12 марта 2011

Попробуйте сделать свое регулярное выражение нежадным:

Pattern p = Pattern.compile("(?<=')(.*?)(?=')");

EDIT:

Это не работает. Это дает следующие совпадения:

here
 and 
also here

Это потому, что взгляд / взгляд назад не потребляют '.

Чтобы исправить это, используйте регулярное выражение:

Pattern p = Pattern.compile("'(.*?)'");

или даже лучше (и быстрее):

Pattern p = Pattern.compile("'([^']*)'");
1 голос
/ 12 марта 2011

Это должно работать для вас:

    Pattern p = Pattern.compile("'([\\w\\s]+)'");
    String info = "Data I need to extract is 'here' and 'also here'";
    Matcher m = p.matcher(info);
    while (m.find()) {
        System.out.println(m.group(1));
    }

Вот распечатка: -

here
also here

Если вы хотите, чтобы данные были разделены на 2 отдельные группы, вы можете сделать что-то вроде этого: -

    Pattern p = Pattern.compile("^[\\w\\s]*?'([\\w\\s]+)'[\\w\\s]*?'([\\w\\s]+)'$");
    String info = "Data I need to extract is 'here' and 'also here'";
    Matcher m = p.matcher(info);
    while (m.find()) {
        System.out.println("Group 1: " + m.group(1));
        System.out.println("Group 2: " + m.group(2));
    }

Вот распечатка:

Group 1: here
Group 2: also here
1 голос
/ 12 марта 2011

Я думаю, ты усложняешь, попробуй

Pattern.compile("'([^']+)'");

или

Pattern.compile("'(.*?)'");

Они оба будут работать. Затем вы можете извлечь результат из первой группы matcher.group(1) после выполнения matcher.find().

0 голосов
/ 12 марта 2011

Почему бы не использовать просто следующее?

'.*?'
...