regular - regex online




¿Cómo funciona la expresión regular '(?<=#)[^#]+(?=#)'? (2)

Tengo la siguiente expresión regular en un programa de C #, y tengo dificultades para entenderlo:

(?<=#)[^#]+(?=#)

Lo dividiré en lo que creo que entendí:

(?<=#)    a group, matching a hash. what's `?<=`?
[^#]+     one or more non-hashes (used to achieve non-greediness)
(?=#)     another group, matching a hash. what's the `?=`?

Entonces el problema que tengo es la parte ?<= Y ?< . Al leer MSDN,? ?<name> se usa para nombrar grupos, pero en este caso el corchete angular nunca se cierra.

No pude encontrar ?= En los documentos, y su búsqueda es realmente difícil, porque los motores de búsqueda ignorarán en su mayoría esos caracteres especiales.


Como se menciona en otro póster, se trata de regular-expressions.info/Lookarounds , construcciones especiales para cambiar lo que coincide y cuándo. Esto dice:

(?<=#)    match but don't capture, the string `#`
            when followed by the next expression

[^#]+     one or more characters that are not `#`, and

(?=#)     match but don't capture, the string `#`
            when preceded by the last expression

Entonces esto coincidirá con todos los personajes entre dos # s.

Lookaheads y lookbehinds son muy útiles en muchos casos. Considere, por ejemplo, la regla "unir todas las b s no seguidas por una a ". Tu primer intento podría ser algo así como b[^a] , pero eso no está bien: esto también coincidirá con el bu en bus o el bo en boy , pero solo querías el b . Y no coincidirá con el b en la cab , aunque eso no sea seguido por una a , porque no hay más personajes para unir.

Para hacerlo correctamente, necesita un vistazo: b(?!a) . Esto dice "coincide con una b pero no coincide con una a después, y no hagas esa parte del partido". Por lo tanto, coincidirá solo con el b en bolo , que es lo que quieres; también coincidirá con el b en la cab .






lookaround