/ / Regex obtener oración con una palabra específica - java, regex

Regex obtener oración con una palabra específica - java, regex

Tengo un montón de texto que se ve así (este es un ejemplo):

Algunas cadenas aleatorias, contenido, etc., nada especial.APERTURA POR XZXDS primer texto que quiero obtener. otras cadenas aleatorias, algunas noticias innecesarias, etc. CIERRE el segundo texto que quiero obtener. y luego un poco más de contenido y contenido APERTURA POR LLXAS tercer texto que quiero obtener. otra vez aburridas noticias, nada CIERRE el cuarto texto que quiero obtener. y así...

Quiero obtener cada frase que contiene la palabra: TEXTO. por ejemplo, en este caso obtendría:

primer texto que quiero obtener.

Segundo texto que quiero obtener.

tercer texto que quiero obtener.

Cuarto texto que quiero obtener.

La forma en que creo que es posible es: En mi texto hay texto aleatorio, pero este texto siempre termina con "OPENING BY XXXX" o "CLOSING". Así que creo que podría obtener mi texto que está entre la palabra "APERTURA POR XXXX" o "CIERRE" y "." (puntos). XXX puede ser diferente, necesita ser excluido. ¿Puede alguien ayudar con la función de expresiones regulares para esto?

Simplemente exprima todo lo que es antes de ABRIR POR, excluya una palabra lo que es después de ABRIR POR, obtenga mi texto hasta que llegue a "".

Solía ​​tener algo similar, pero era más fácil porque recibí una oración con una palabra específica entre dos puntos. No tengo dos puntos entre mi oración ahora. Estoy agregando código para lo que solía tener:

String pattern = "[^.]*bSPECIFICWORDb[^.]*"

Creo que podemos mantener la segunda parte de esto, pero la primera parte necesita ser modificada.

Lo necesito para mi aplicación Java. Gracias por ayudar.

Respuestas

2 para la respuesta № 1
    Pattern p = Pattern.compile("(?:(?:opening by [^ ]+)|(?:closing))"
+ "((?:[^\.]*? )*TEXT(?:[^\.]*?))\."
, Pattern.CASE_INSENSITIVE);
final String text = "random text random text random text opening "
+ "by xysd FIRST TEXT I WANT TO GET. random text random "
+ "text random text closing SECOND TEXT I WANT TO GET. "
+ "random text random text random text opening by lxcvznk "
+ "THIRD TEXT. random text random text random text random "
+ "text closing FOURTH TEXT...etc";
Matcher m = p.matcher(text);
while(m.find())
{
System.out.println(m.group(1));
}

Salida:

 FIRST TEXT I WANT TO GET
SECOND TEXT I WANT TO GET
THIRD TEXT
FOURTH TEXT

(?:opening by [^ ]+)|(?:closing)) comienza con "apertura por xxx" o "cierre"

(?:[^\.]*? )* cualquier carácter que no sea un punto seguido de un espacio (según su espacio de necesidades puede ser excluido) cero o más veces

(?:[^\.]*?))\. secuencia sin puntos seguida de.

Si la entrada de texto es excepcionalmente grande, la expresión regular simple puede no ser la mejor opción, puede ser más rápido buscar el prefijo y luego puntear el carácter explícitamente.

Como se comentó en los comentarios, si desea capturar oraciones que contengan cualquiera de dos palabras, digamos, UNA o OTRO, simplemente reemplace TEXTO con (?:ONE|ANOTHER). Se describe en Modelo Documentos en la sección de operadores lógicos.

Si desea saber cuál capturó exactamente, puede usar el grupo de captura (ONE|ANOTHER) y metelo en matcher.group(2):

    Pattern p = Pattern.compile("(?:(?:opening by [^ ]+)|(?:closing))"
+ "((?:[^\.]*? )*(ONE|ANOTHER)(?:[^\.]*?))\."
, Pattern.CASE_INSENSITIVE);
final String text = "random text random text random text opening "
+ "by xysd FIRST ONE I WANT TO GET. random text random "
+ "text random text closing SECOND ANOTHER I WANT TO GET. "
+ "random text random text random text opening by lxcvznk "
+ "ANOTHER TEXT. random text random text random text random "
+ "text closing FOURTH ONE...etc";
Matcher m = p.matcher(text);
while(m.find())
{
System.out.println(m.group(1) + "<-" + m.group(2));
}

FIRST ONE I WANT TO GET<-ONE
SECOND ANOTHER I WANT TO GET<-ANOTHER
ANOTHER TEXT<-ANOTHER
FOURTH ONE<-ONE