Obteniendo el texto que sigue después de la coincidencia de expresiones regulares

84

Soy nuevo en el uso de Regex, he pasado por una serie de tutoriales pero no he encontrado uno que se aplique a lo que quiero hacer,

Quiero buscar algo, pero devuelvo todo lo que sigue, pero no la cadena de búsqueda en sí.

p. ej., " Una frase tonta que es increíble "

buscar " frase "

devuelve " eso es genial "

Cualquier ayuda sería muy apreciada.

Esta es mi expresión regular hasta ahora

sentence(.*) 

pero devuelve: frase que es impresionante

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");
}
Scott
fuente
¿Cuál es tu llamada real? ¿Usted está utilizando Matcher?
Grzegorz Oledzki
Estoy usando comparador y patrón
Scott
... y aún nos gustaría ver su código Java real para ayudar a evaluar lo que está mal.
Steve Jorgensen
System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Nishant
3
@DavidIsNotHere Los nazis deberían tener una N mayúscula ...
Lee Taylor

Respuestas:

135

Puede hacer esto con "solo la expresión regular" como solicitó en un comentario:

(?<=sentence).*

(?<=sentence)es una afirmación retrospectiva positiva . Esto coincide en una determinada posición en la cadena, es decir, en una posición justo después del texto sentencesin que el texto en sí forme parte de la coincidencia. En consecuencia, (?<=sentence).*coincidirá con cualquier texto posterior sentence.

Esta es una característica bastante buena de regex. Sin embargo, en Java esto solo funcionará para subexpresiones de longitud finita, (?<=sentence|word|(foo){1,4})es decir, es legal, pero (?<=sentence\s*)no lo es.

Tim Pietzcker
fuente
Afirma que no debe incluir la afirmación retrospectiva positiva. Así que supongo que ". * (? <= Frase)" debería devolver todo hasta, pero sin incluir "frase". Pero no lo hace, también devuelve "sentencia". ¿Qué me estoy perdiendo?
JJJones_3860
@ user2184214: Eso es porque es una mirada detrás de la afirmación. .*coincide con cualquier texto y luego (?<=...)busca la palabra hacia atrássentence , afirmando en este caso que la coincidencia termina con esa palabra. Si desea detenerse antes de esa palabra, debe mirar hacia adelante : .*(?=sentence)coincidirá con cualquier texto que vaya seguido de sentence.
Tim Pietzcker
17

Tu expresión regular "sentence(.*)"es correcta. Para recuperar el contenido del grupo entre paréntesis, llamaría:

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"
}

Tenga en cuenta el uso de m.find()en este caso (intenta encontrar en cualquier lugar de la cadena) y no m.matches()(fallaría debido al prefijo "algo cojo"; en este caso, la expresión regular debería ser ".*sentence(.*)")

st. nunca
fuente
Gracias, pero ¿y si solo quiero que vuelva "eso es increíble"
Scott
Gracias hombre, esto funcionó muy bien, esperaba que hubiera una manera de hacer esto solo con la expresión regular, si no puedo encontrar una manera de hacerlo de esa manera, esto también funcionará
Scott
Probablemente una mala idea agregar un "(. *)" Al final de la
expresión regular
8

si Matcher se inicializa con str, después de la coincidencia, puede obtener la parte después de la coincidencia con

str.substring(matcher.end())

Código de muestra:

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

Salida:

eso es asombroso

Sean Patrick Floyd
fuente
matcher.find()se requiere antes de esto, IMO.
Nishant
@Nishant eso es lo que escribí: "después del partido". Se agregó un código de muestra para ilustrar
Sean Patrick Floyd
1

Debe usar el grupo (int) de su comparador: el grupo (0) es la coincidencia completa y el grupo (1) es el primer grupo que marcó. En el ejemplo que especifica, el grupo (1) es lo que viene después de " oración ".

Rami C
fuente
1

Solo necesita poner "grupo (1)" en lugar de "grupo ()" en la siguiente línea y la devolución será la que esperaba:

System.out.println("I found the text: " + matcher.group(**1**).toString());
Ricardo Ferreira
fuente