2009-02-13 11 views

Respuesta

26

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 carta que sigue a "él" como una palabra completa seguido de un espacio. no coincide "muy" en sí, no es necesario que preocuparse de volver a insertarlo en el caso de, por ejemplo, reemplazos.

Como 1 Dicho esto, 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 funcionaría.)

+0

me ganó también :) – annakata

+0

Lookbehinds tienden a ser bastante limitados cuando se trata de usar comodines. – cletus

+0

Lookbehinds podría no ser necesario aquí. Dependiendo de lo que "quiero emparejar" en la pregunta se refiere a, vea la solución de David Kemp. – user55400

-1

que \ b \ B

EDITAR (*.): aunque dependiendo de la implementación de expresiones regulares, esto podría ser hambre y encontrar todas las palabras después de que

+0

Eso va a juego con el resto de la oración. – cletus

+0

tienes que hacer eso no codicioso – tliff

+0

En realidad, no depende de la implementación, o al menos nunca he encontrado una implementación de expresiones regulares que no sea codiciosa de forma predeterminada. No codicioso siempre es un cambio (al menos en Perl, PHP, Java y .Net). – cletus

1

que \ b (\ w *)

+0

Parece que solo coincide con ipsum. –

+0

Probablemente haga que \ b + (\ w +) al menos – cletus

+0

ipsum \ b + (\ w +) no sea una expresión regular válida. –

4

Algunos de los otros respondedores han sugerido el uso de una expresión regular que no depende de lookbehinds, pero 1 piensan que es necesario un ejemplo de trabajo completa para obtener el punto de ancho. La idea es que usted empareja la secuencia completa ("Investigación", 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 "inteligente" y "ahora". Para hacer eso con la versión de búsqueda hacia atrás, que tendría que hacer algo como hacker:

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

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

Sin embargo, las personas de mayor problema parece estar teniendo en sus ejemplos no es con 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, uno 1've incluso visto repetido 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.

0

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

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

Cuestiones relacionadas