avechuche, puedes simplificar
[[:digit:]] con
\d, así la expresión del principio queda
KB\d+
La tuya está bien, que quede claro, lo digo por simplificar.
La utilidad principal del modo 1 de
StringRegExp es simplemente cuando queremos comprobar que una cadena corresponde a un patrón dado. Por ejemplo cuando en una entrada de usuario queremos saber si nos ponen correctamente el formato de un email, de una fecha, etc.
jamaro, creo que pones demasiados corchetes, que son para seleccionar un carácter entre varios, pero para poner uno... simplemente lo pones.
En este caso es verdad que es especial al tratarse de paréntesis, pero con el escape es suficiente:
KB\d+ \(.+\)|KB\d+
Muy buen punto lo de poner la más restrictiva antes.
En este caso si no se me escapa nada creo que se podría hacer simplemente la parte entre paréntesis opcional, con un "
?" (cero o una apariciones).
En principio:
KB\d+( \(.+\))?
Lo que pasa es que creamos un grupo que no queremos capturar, así que hay que hacerlo no capturable:
KB\d+(?: \(.+\))?
En realidad es casi tan larga como la del OR, pero creo que será más eficiente al no tener que partir el análisis en dos ramas.
avechuche, para hacer expresiones regulares hay que tener clarísimo cómo es el tipo de cadena que quieres capturar, si no es un lío. A ver si lo he entendido:
Buscas cadenas que empiezan por ">" y que están formadas por "KB" seguido de varios dígitos, y opcionalmente seguidos de un espacio y algo entre paréntesis.
Lo quieres capturar todo menos el ">".
¿Es eso?
Si el KB... empieza por algo que no sea ">" no lo quieres (da igual que sea "#" u otra cosa ¿no?).
Entonces creo que basta con añadir el ">" al principio de la expresión, pero como ya no queremos capturar toda la subcadena ponemos entre paréntesis lo demás, para indicar que queremos capturar eso:
>(KB\d+(?: \(.+\))?)
Es decir:
una cadena "
KB" seguida de uno o más dígitos "
\d+" y opcionalmente de un espacio seguido de algo entre paréntesis "
( \(.+\))?", pero eso no lo queremos capturar aparte así que lo hacemos no capturable "
(?: \(.+\))?". Todo eso "
KB\d+(?: \(.+\))?" queremos que esté precedido de "
>", "
>KB\d+(?: \(.+\))?", pero no queremos capturar el "
>" así que capturamos lo demás poniéndolo entre paréntesis:
>(KB\d+(?: \(.+\))?)
Espero que funcione como quieres...