Puede que la documentación no sea muy extensa pero léetela mejor.
Los corchetes se usan para indicar un grupo de caracteres, y sustituyen en la ER un carácter.
Por ejemplo la ER
[mcgp]asa casará con "masa", "casa", "gasa" y "pasa".
No sé por qué miras lo del principio de la cadena si dices que buscas en cualquier parte de la cadena.
Quieres coger los números que estén después de "\", esa primera parte es fácil:
\\\d+
porque estamos hablando de cualquier número de dígitos ¿no? Si está limitado mejor lo pones para hacer la ER más eficiente, por ejemplo si siempre son códigos de dos cifras:
\\\d{2}
La otra parte es que delante del \ no haya otro \, eso ya es más complicado. Para los que no están al principio de la cadena (ahora sí hay que mirarlo) sería:
[^\\](\\\d+)
Para que tome también si está al principio junto con otros posteriores es más complicado, luego lo acabo, por ahora tengo:
(?:^|[^\\])(\\\d+)
que funciona bien tanto al princpio como en medio si no están seguidos, por ejemplo funciona con "\34a\23", pero no con "\34\23", porque al mirar antes de \23 que no haya otro \ se deberia mirar el 4, pero eso ya está consumido al tomar el grupo anterior...
Creo que hay que hacerlo con lo de las "assertions", luego lo miro.
Vale, ya lo tengo, efectivemente con una
Lookbehind assertion se hace fácilmente:
http://www.autoitscript.com/autoit3/pcr ... html#SEC15
El problema de lo anterior es que las dos partes del OR
(^|[^\\]) son diferentes en que
^ (que significa principio de cadena, similar a
\A) no consume caracteres, en cambio
[^\\] significa "un carácter que no es
\", y eso sí consume, y eso hace más difícil la unión de las dos posibilidades (que antes de la cadena buscada haya
algo diferente de \ o
nada)
Pero con las assertion se pueden mirar partes de la cadena sin consumirlas, así que si usamos:
(?<!\\)(\\\d+)
creo que ya está resuelto, eso coge nuestra cadena si antes no hay un "
\" (y eso incluye el principio de cadena), ya que por ejemplo para "
\34\23" aunque el 34 se ha consumido en el primer match, para el segundo la aserción puede mirar el 4 para ver que no es un "\".
Por cierto, el grupo de la aserción no es capturable, así que eso sólo capturará
\34 y
\23. Ah, si no se quiere la barra, sólo los números, entonces es:
(?<!\\)\\(\d+)
Para mí que hay una manera sin aserciones, la verdad es que he estado cerca, pero no he dado con ello.
Ampliación:
Vale, respecto a tu expresión
((\A\\[\d]+)|(^\\\\[\d]+)) te explico a ver si entiendes un poco mejor.
Para empezar te devuelve dos veces lo mismo porque tienes toda la expresión entre paréntesis, con lo que te lo devuelve una vez por el grupo interior y otra por el global.
Por otro lado
[\d] no hace falta ponerlo entre corchetes porque
\d ya es un carácter numérico,
\d es equivalente a
[0123456789] (que también se puede escribir
[0-9]). Se podría poner entre corchetes si fueras a añadirlo a más cosas pero si se usa por sí mismo te lo puedes ahorrar. Así que por ahora tenemos:
(\A\\\d+)|(^\\\\\d+)
(dad gracias que estamos en AutoIT, eso en los muchos lenguajes que doblan los \ sería:
(\\A\\\\\\d+)|(^\\\\\\\\\\d+)
Por otro lado el carácter ^ significa "inicio de cadena", excepto dentro de un conjunto (corchetes), que es cuando es la negación del conjunto. Así que para poner "un carácter que no es \" tienes que ponerlo, esta vez sí, entre corchetes:
[^\\], así que tenemos:
(\A\\\d+)|([^\\]\\\d+)
Pero ese "carácter que no es \" no lo quieres capturar, así que lo sacamos del paréntesis:
(\A\\\d+)|[^\\](\\\d+)
Y eso casi funciona, pero tiene el problema que tenía yo en la última versión sin aserciones, si te fijas es lo mismo pero yo agrupé el factor común
\\\d+.
La otra diferencia es que yo usaba
^ en vez de
\A, que son equivalentes cuando no hay retornos de carro dentro de la cadena.
El problema ya lo he comentado antes pero lo detallo. Por ejemplo para
\34\23, la expresión
(\A\\\d+) capturará el primer
\34, ahora queda por analizar la subcadena
\23 pero:
(\A\\\d+) no hace match con ella pues no está al principio de cadena.
[^\\](\\\d+) tampoco hace match con ella porque antes de
\\\d+ ("una barra seguida de números", o sea, toda la subcadena
\23)
NO tiene
[^\\] (un carácter que no es \), y no lo tiene porque no hay nada.
Como decía antes nos puede parecer que el 4 anterior vale de "carácter que no es \", pero no es utilizado en el análisis porque ya ha sido consumido para el primer match (por eso funciona el método de la aserción, porque precisamente sirve para analizar la cadena sin consumirla)