Jestem nowy w używaniu Regex, przeszedłem przez kilka samouczków, ale nie znalazłem takiego, który odnosi się do tego, co chcę robić,
Chcę czegoś wyszukać, ale zwracam wszystko, co następuje, ale nie sam ciąg wyszukiwania
np. „ Jakieś kiepskie zdanie, które jest niesamowite ”
wyszukaj „ zdanie ”
powrócić „ to jest niesamowite ”
Każda pomoc byłaby bardzo mile widziana
Jak dotąd to jest moje wyrażenie regularne
sentence(.*)
ale zwraca: zdanie, które jest niesamowite
Pattern pattern = Pattern.compile("sentence(.*)");
Matcher matcher = pattern.matcher("some lame sentence that is awesome");
boolean found = false;
while (matcher.find())
{
System.out.println("I found the text: " + matcher.group().toString());
found = true;
}
if (!found)
{
System.out.println("I didn't find the text");
}
Matcher
?System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Odpowiedzi:
Możesz to zrobić za pomocą „tylko wyrażenia regularnego”, o które prosiłeś w komentarzu:
(?<=sentence)
jest pozytywnym stwierdzeniem typu lookbehind . To dopasowuje w określonej pozycji w ciągu, a mianowicie w pozycji tuż za tekstem,sentence
nie czyniąc samego tekstu częścią dopasowania. W konsekwencji(?<=sentence).*
dopasuje dowolny tekst posentence
.To całkiem fajna funkcja regex. Jednak w Javie będzie to działać tylko dla podwyrażeń o skończonej długości, tj.
(?<=sentence|word|(foo){1,4})
Jest legalne, ale(?<=sentence\s*)
nie jest.źródło
.*
dopasowuje dowolny tekst, a następnie(?<=...)
szuka słowa wsteczsentence
, stwierdzając w tym przypadku, że dopasowanie kończy się tym słowem. Jeśli chcesz zatrzymać się przed tym słowem, musisz spojrzeć w przyszłość :.*(?=sentence)
dopasuje każdy tekst, po którym następujesentence
.Twoje wyrażenie regularne
"sentence(.*)"
ma rację. Aby pobrać zawartość grupy w nawiasach, możesz zadzwonić:Pattern p = Pattern.compile( "sentence(.*)" ); Matcher m = p.matcher( "some lame sentence that is awesome" ); if ( m.find() ) { String s = m.group(1); // " that is awesome" }
Zwróć uwagę na użycie
m.find()
w tym przypadku (próby znalezienia dowolnego miejsca w ciągu) i niem.matches()
(nie powiedzie się z powodu przedrostka „jakiś lame”; w tym przypadku regex musiałby być".*sentence(.*)"
)źródło
jeśli Matcher jest zainicjowany
str
, to po dopasowaniu możesz otrzymać część po dopasowaniu za pomocąPrzykładowy kod:
final String str = "Some lame sentence that is awesome"; final Matcher matcher = Pattern.compile("sentence").matcher(str); if(matcher.find()){ System.out.println(str.substring(matcher.end()).trim()); }
Wynik:
źródło
matcher.find()
jest wymagana wcześniej, IMO.Musisz użyć grupy (int) swojego dopasowania - grupa (0) to cały mecz, a grupa (1) to pierwsza zaznaczona grupa. W podanym przykładzie grupa (1) występuje po wyrażeniu „ zdanie ”.
źródło
Wystarczy, że w poniższym wierszu wpiszesz „group (1)” zamiast „group ()”, a wynik będzie zgodny z oczekiwaniami:
System.out.println("I found the text: " + matcher.group(**1**).toString());
źródło