regex - que - expresiones regulares c#
¿Cómo hacer coincidir la primera palabra después de una expresión con expresiones regulares? (5)
Por ejemplo, en este texto:
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.
Quiero unir la palabra después de ''ipsum''.
Algunos de los otros respondedores han sugerido usar una expresión regular que no dependa de las miradas atrás, pero creo que se necesita un ejemplo completo y funcional para transmitir el mensaje. La idea es que coincida con la secuencia completa ("ipsum" más la siguiente palabra) de la manera normal, luego use 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 esto imprime tanto "dolor" como "Nunc". Para hacer eso con la versión lookbehind, tendrías que hacer algo hackish como:
Pattern p = Pattern.compile("(?<=ipsum//W{1,2})(//w+)");
Eso está en Java, que requiere que el lookbehind tenga una longitud máxima obvia. Algunos sabores no tienen ni siquiera mucha flexibilidad, y por supuesto, algunos no son compatibles con el lookbehinds en absoluto.
Sin embargo, el mayor problema que la gente parece tener en sus ejemplos no es con miradas atrás, sino con límites de palabras. Tanto David Kemp como ck parecen esperar /b
que coincida con el carácter de espacio que sigue a la ''m'', pero no es así; coincide con la posición (o límite) entre la ''m'' y el espacio.
Es un error común, uno que incluso he visto repetirse en algunos libros y tutoriales, pero el constructo de límite de palabras, /b
, nunca coincide con ningún personaje. Es una aserción de ancho cero, como orientaciones y anclas ( ^
, $
, /z
, etc.), y lo que coincide es una posición que está precedida por un carácter de palabra y no seguido por uno, o seguido por un carácter de palabra y no precedido por uno.
Esto parece un trabajo para mirar atrás, aunque debe tener en cuenta que no todos los sabores regex los respaldan. En tu ejemplo:
(?<=/bipsum/s)(/w+)
Esto coincidirá con cualquier secuencia de caracteres de letras que siga a "ipsum" como una palabra completa seguida de un espacio. No coincide con el "ipsum" en sí mismo, no necesita preocuparse por reinsertarlo en caso de, por ejemplo, reemplazos.
Como ya he dicho, algunos sabores (JavaScript, por ejemplo) no admiten mirar hacia atrás en absoluto. Muchos otros (la mayoría, de hecho) solo admiten búsquedas de "ancho fijo", por lo que podría usar este ejemplo pero no cualquiera de los operadores de repetición. (En otras palabras, (?<=/b/w+/s+)(/w+)
no funcionaría.)
ipsum / b (. *) / b
EDITAR: aunque dependiendo de su implementación de expresiones regulares, esto podría estar hambriento y encontrar todas las palabras después de ipsum
ipsum / b (/ w *)
Con javascript
puedes usar (?=ipsum.*?(/w+))
Esto obtendrá la segunda ocurrencia también (Nunc)