Cómo hacer coincidir la primera palabra después de una expresión con expresiones regulares?

StackOverflow https://stackoverflow.com/questions/546220

  •  23-08-2019
  •  | 
  •  

Pregunta

Por ejemplo, en este texto:

  

Lorem ipsum dolor sit amet, elit consectetur adipiscing. Nunc eu Tellus vel nunc pretium Lacinia. Proin sed lorem. Cras sed ipsum. Nunc un libero quis RISUS sollicitudin imperdiet.

Quiero que coincida con la palabra tras 'ipsum'.

¿Fue útil?

Solución

Esto suena como un trabajo para lookbehinds, aunque debe tener en cuenta que no todos los sabores de expresiones regulares los apoyan. En su ejemplo:

(?<=\bipsum\s)(\w+)

Esto coincidirá con cualquier secuencia de caracteres de letras que sigue "ipsum" como una palabra completa seguido de un espacio. No no partido "ipsum" en sí mismo, no es necesario que preocuparse de volver a insertarlo en el caso de, por ejemplo, reemplazos.

Como ya he dicho, sin embargo, algunos sabores (JavaScript, por ejemplo) no admiten de búsqueda hacia atrás en absoluto. Muchas otras (la mayoría, de hecho) sólo admiten lookbehinds "ancho fijo" - lo que podría utilizar este ejemplo, pero no cualquiera de los operadores de repetición. (En otras palabras, (?<=\b\w+\s+)(\w+) ¿no trabajo.)

Otros consejos

Algunos de los otros respondedores han sugerido el uso de una expresión regular que no depende de lookbehinds, pero creo que se necesita un ejemplo de trabajo completa para conseguir el punto a través. La idea es que usted empareja la secuencia completa ( "ipsum", además de la siguiente palabra) de la forma habitual, a continuación, utilizar un grupo de captura para aislar la parte que le interese. Por ejemplo:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

Tenga en cuenta que esta opción se imprime tanto "dolor" y "Nunc". Para hacer eso con la versión de búsqueda hacia atrás, que tendría que hacer algo hacker como:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

Eso es en Java, que requiere la búsqueda hacia atrás para tener una longitud máxima obvia. Algunos sabores no tienen ni siquiera eso flexibilidad, y por supuesto, algunos no soportan lookbehinds en absoluto.

Sin embargo, la gente mayor problema que parecen tener en sus ejemplos no es con la lookbehinds, pero con límites de las palabras. Tanto David Kemp y CK parecen esperar \b para que coincida con el carácter de espacio después de la 'm', pero no es así; que coincide con la posición (o límite) entre la 'm' y el espacio.

Es un error común, que he visto, incluso repite en algunos libros y tutoriales, pero la construcción de límite de palabra, \b, no coincide con cualquier carácter. Es una afirmación de anchura cero, como lookarounds y anclajes (^, $, \z, etc.), y lo que coincide es una posición que está ya sea precedido por un carácter de palabra y no con uno, o seguido por un carácter de palabra y no ha sido precedida por una.

ipsum \ b (\ w *)

Con javascript puede utilizar (?=ipsum.*?(\w+))

Esto hará que la segunda aparición, así (Nunc)

ipsum \ b (. *) \ B

EDIT: aunque dependiendo de la implementación de expresiones regulares, esto podría ser hambre y encontrar todas las palabras después ipsum

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top