Java Regex - получить все слова перед подстрокой в ​​строке

У меня есть строка, содержащая предложение, и я хочу разделить ее пополам на основе слова. У меня есть регулярное выражение (\\w+) word, которое, как я думал, даст мне все слова до «слова» + «слово», тогда я мог бы просто удалить последние четыре символа.

Однако это, похоже, не работает .. есть идеи, что я сделал неправильно?

Спасибо.


person crazyfool    schedule 02.05.2012    source источник
comment
код более полезен, чем описание проблемы.   -  person twain249    schedule 02.05.2012
comment
Может быть, рассмотреть нежадный квалификатор '+?' вместо "+"   -  person Guillaume Polet    schedule 02.05.2012
comment
Кажется, это не работает, да? Что случается? Что вы хотите, чтобы произошло?   -  person erickson    schedule 02.05.2012
comment
почему бы просто не использовать слово? Используя Pattern.find, вы можете найти его индекс в строке   -  person ControlAltDel    schedule 03.05.2012


Ответы (5)


Кажется, это работает:

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

public class Test {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("([\\w\\s]+) word");
        Matcher m = p.matcher("Could you test a phrase with some word");
        while (m.find()) {
            System.err.println(m.group(1));
            System.err.println(m.group());
        }
    }
}
person Guillaume Polet    schedule 02.05.2012

Использование манипуляций со строками:

int idx = sentence.indexOf(word);
if (idx < 0)
  throw new IllegalArgumentException("Word not found.");
String before = sentence.substring(0, idx);

Использование регулярного выражения:

Pattern p = Pattern.compile(Pattern.quote(word));
Matcher m = p.matcher(sentence);
if (!m.find())
  throw new IllegalArgumentException("Word not found.");
String before = sentence.substring(0, m.start());

В качестве альтернативы:

Pattern p = Pattern.compile("(.*?)" + Pattern.quote(word) + ".*");
Matcher m = p.matcher(sentence);
if (!m.matches())
  throw new IllegalArgumentException("Word not found.");
String before = m.group(1);
person erickson    schedule 02.05.2012

Вы захотите обозначить каждую часть предложения до и после слова.

http://docs.oracle.com/javase/1.5.0/docs/api/

 String[] result = "this is a test".split("\\s"); //replace \\s with your word
 for (int x=0; x<result.length; x++)
     System.out.println(result[x]);
person Chad    schedule 02.05.2012
comment
Я мог бы помочь расширить свой пример, если это необходимо, но краткий обзор заключается в том, что разделы предложения хранятся в массиве, и оно разделено по слову, которое вы разбиваете на предложение. - person Chad; 03.05.2012

Попробуй это:

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

public class Test {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^.*?(?= word)");
        Matcher m = p.matcher("Everything before the word");
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

Он распадается следующим образом:

.*? все

(?= перед

слово

) конец

person Ben M    schedule 02.05.2012
comment
Ах да, дурацкая попытка красиво резюмирует :) Я тут не хамлю, я говорю факт... - person MarioDS; 03.05.2012
comment
Я не понимаю, как необходим формат кода, поскольку вопрос касался самого регулярного выражения, я предполагаю, что он уже знает, как скомпилировать выражение. Я дал выражение и разбил его на части, чтобы показать, что делает каждый раздел. Я постараюсь быть более описательным в будущем, новичок в переполнении стека. - person Ben M; 08.05.2012
comment
Ваше редактирование уже намного лучше, я снял отрицательный голос. Веселитесь на СО! - person MarioDS; 08.05.2012

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

Если вы измените его на (\\w+?) word, он должен работать (неохотный квантификатор). Подробнее о квантификаторах и их точном назначении здесь.

person MarioDS    schedule 02.05.2012
comment
+ жадный, но разрешает откат. Притяжательный эквивалент ++ - person erickson; 03.05.2012
comment
Ладно, тогда я никогда не разбирался в квантификаторах. Я думаю, что под возвратом вы подразумеваете, что на самом деле указываете, где и что в регулярном выражении? Принимая во внимание, что reluctant автоматически найдет 2 совпадения, учитывая, что входная строка содержит word, который он искал... - person MarioDS; 03.05.2012
comment
Под возвратом я подразумеваю, что выражение \\w+\\w будет соответствовать xy. Сопоставитель сопоставит \\w+ с xy, а затем поймет, что больше нечего сопоставлять второму \\w. Таким образом, он будет возвращаться, сопоставляя \\w+ с x и вторым \\w с y. - person erickson; 03.05.2012