regex - regulares - Expresión regular para omitir el carácter en el grupo de captura
expresiones regulares ejemplos (5)
Algo tarde, pero creo que descubrí esto. Al menos una forma de hacerlo.
Utilicé la búsqueda positiva para detenerme en el signo # en mi texto. No quería el espacio ni el signo #, así que tuve que encontrar una forma de "saltarme" sobre ellos. Entonces, cuando me forzaron a unirlos de nuevo, los arrojé a un grupo de basura que no planeaba usar (es decir, un cubo pequeño) que en el código es. Ahora, mi puntero de lugar es una posición de personaje más allá del signo # (donde quiero estar, omitiendo el espacio y el signo #). Y ahora solo coincido con el final del nombre de archivo en el. e ignora la extensión del archivo.
(?i)English//(?<Series>[^ ]+) - (?<Title>.+(?= #))(?<garb1>..)(?<Number>[^.]+)(?-i)
El nombre de archivo en el que se usó es
F:/Downloads/Downloads/500 Comics CCC CBR English/Isukani - Great Girl #01.cbr
¿Es posible omitir un par de caracteres en un grupo de captura en expresiones regulares? Estoy utilizando .NET expresiones regulares, pero eso no debería importar.
Básicamente, lo que estoy buscando es:
[texto al azar] AB-123 [texto al azar]
y necesito capturar ''AB123'', sin el guion.
Sé que AB tiene 2 o 3 caracteres en mayúsculas y 123 tiene 2 o 3 dígitos, pero esa no es la parte más difícil. La parte difícil (al menos para mí) es omitir el guión.
Supongo que podría capturar ambos por separado y luego concatenarlos en código, pero me gustaría tener una solución más elegante, con solo expresión regex.
¿Alguna sugerencia?
En resumen: no puedes. Una coincidencia es siempre consecutiva, incluso cuando contiene elementos como aserciones de ancho cero, no hay forma de emparejar el siguiente carácter si quiere llegar al siguiente.
Puede usar grupos de captura anidados, como este:
((AB)-(123))
El primer grupo de captura es AB-123
, el segundo es AB
y el tercero es 123
. Entonces, todo lo que tendrías que hacer es unirte al segundo y tercer grupo con un espacio.
Realmente no hay una manera de crear una expresión tal que el texto coincidente sea diferente de lo que se encuentra en el texto fuente. Tendrá que quitar el guión en un paso separado, ya sea al hacer coincidir las partes primera y segunda individualmente y concatenar los dos grupos:
match = Regex.Match( text, "([A-B]{2,3})-([0-9]{2,3})" );
matchedText = string.Format( "{0}{1}",
match.Groups.Item(1).Value,
match.Groups.Item(2).Value );
O al eliminar el guión en un paso separado del proceso de coincidencia:
match = Regex.Match( text, "[A-B]{2,3}-[0-9]{2,3}" );
matchedText = match.Value.Replace( "-", "" );
Su afirmación de que no es posible hacerlo sin subgrupos + concatenación es correcta.
También podría hacer como Jeff-Hillman y simplemente eliminar los malos personajes después del hecho.
Es importante tener en cuenta que aunque "no utilizas expresiones regulares para todo".
Regex está diseñado para soluciones menos complicadas para problemas no triviales, y no debe usar "oh, usaremos una expresión regular" para todo, y no debe entrar en el hábito de pensar que puede resolver el problema de una vez. regex de un paso
Cuando hay un método trivial viable que funciona, por supuesto, úselo.
Una Idea alternativa, si necesita devolver varias coincidencias en un cuerpo de código, busque la expresión regular de "devolución de llamada" de sus idiomas, que permite pasar cualquier grupo coincidente / encontrado a una llamada de función que puede hacer una sustitución en línea. (Especialmente útil para hacer regexp reemplaza).
No estoy seguro de cómo funcionaría en .Net, pero en php harías algo así como (código no exacto)
function strip_reverse( $a )
{
$a = preg_replace("/-/", "", $a );
return reverse($a);
}
$b = preg_replace_callback( "/(AB[-]?cde)/" , ''strip_reverse'' , "Hello World AB-cde" ;