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");
}
Matcher
?System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Respuestas:
Puede hacer esto con "solo la expresión regular" como solicitó en un comentario:
(?<=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 textosentence
sin que el texto en sí forme parte de la coincidencia. En consecuencia,(?<=sentence).*
coincidirá con cualquier texto posteriorsentence
.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.fuente
.*
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 desentence
.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 nom.matches()
(fallaría debido al prefijo "algo cojo"; en este caso, la expresión regular debería ser".*sentence(.*)"
)fuente
si Matcher se inicializa con
str
, después de la coincidencia, puede obtener la parte después de la coincidencia conCó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:
fuente
matcher.find()
se requiere antes de esto, IMO.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 ".
fuente
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());
fuente