2012-05-02 2 views
4

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

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

Спасибо.

+0

код является более полезным, то с описанием проблемы. – twain249

+0

Возможно, рассмотрим не-жадный классификатор '+?' вместо «+» –

+1

«Это, похоже, не работает», а? Что происходит? Что вы хотите? – erickson

ответ

7

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

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()); 
     } 
    } 
} 
3

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

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]); 
+0

. Я мог бы помочь расширить мой пример, если это необходимо, но быстрый просмотр состоит в том, что разделы предложения хранятся в массиве и разделяются словом, которое у вас есть нарушая предложение. – Chad

0

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

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

+0

'+' жадный, но он * делает * позволяет отступать. Притяжательный эквивалент '++' – erickson

+0

Итак, я никогда не думал о кванторах. Я думаю, что, возвращаясь назад, вы имеете в виду, что вы действительно указываете, где и что в регулярном выражении? Принимая во внимание, что неохотно найдет 2 совпадения автоматически, учитывая, что входная строка содержит слово, которое он искал ... – MarioDS

+1

По возвращении я подразумеваю, что выражение «\\ w + \\ w» будет соответствовать «xy». Матч будет соответствовать «\\ w +» против «xy», а затем поймет, что нет ничего, чтобы соответствовать второму «\\ w».Таким образом, он будет отступать, сопоставляя «\\ w +» с «x», а второй «\\ w» против «y». – erickson

5

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

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); 
1

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

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()); 
     } 
    } 
} 

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

. *? все

(? = перед тем

слова

) конец

+0

Нет кода, а не java, не работает, должен ли я продолжать? – MarioDS

+0

О да, глупая попытка суммирует его хорошо :) Я не груб здесь, я говорю об этом ... – MarioDS

+0

Я не вижу, как нужен формат кода, поскольку вопрос касался самого регулярного выражения, Я бы предположил, что он уже знает, как скомпилировать выражение. Я произнес выражение и разделил его, чтобы показать, что делает каждая секция. Я постараюсь быть более наглядным в будущем, совершенно новым для переполнения стека. –

Смежные вопросы