2012-10-03 27 views
6

Tengo regex que coincide con palabras finas excepto si contienen un carácter especial como ~ Consulta que es el nombre de un miembro de una clase de C++. Necesita utilizar el límite de palabras como se muestra a continuación para los nombres de miembros que son caracteres únicos. $key =~ /\b$match\b/regex para que coincida con el límite de palabras que comienza con caracteres especiales

he intentado numerosas expresiones que pensé que funciona como /[~]*\b$match\b/ o /\b[~]*$match\b/

¿Es posible poner un límite de palabra de palabras que puede contener un carácter especial?

+1

Puede publicar exactamente lo que quiere que coincida ... Regex se genera para casos específicos, no solo suponiendo cuál es su cadena. –

+1

'/ ~ \ b $ match \ b/'debe coincidir con' ~ Query', asumiendo que la expresión regular contenida en '$ match' coincidiría con' Query'. (Acabo de probar, y '" ~ foo "= ~/~ \ bfoo \ b /' se evalúa como verdadero.) – cdhowie

+0

La variable $ match podría contener ~ Query, Query, o single letter como p. Posiblemente, otros desarrolladores de nombres extraños lo usen para sus métodos de clase. Regex es parte de una subrutina que está haciendo una búsqueda. Todo funciona bien, excepto cuando $ match contiene ~ Query. –

Respuesta

10
\b 

es la abreviatura de

(?:(?<!\w)(?=\w)|(?<=\w)(?!\w)) 

Si usted quiere tratar ~ como un carácter de palabra, cambiar \w a [\w~]. el uso

(?:(?<![\w~])(?=[\w~])|(?<=[\w~])(?![\w~])) 

Ejemplo:

my $word_char = qr/[\w~]/; 
my $boundary = qr/(?<!$word_char)(?=$word_char) 
        |(?<=$word_char)(?!$word_char)/x; 

$key =~ /$boundary$match$boundary/ 

Si sabemos $match sólo puede coincidir con algo que empieza y termina con una $word_char, podemos simplificar la siguiente manera:

my $word_char = qr/[\w~]/; 
my $start_bound = qr/(?<!$word_char)/; 
my $end_bound = qr/(?!$word_char)/; 

$key =~ /$start_bound$match$end_bound/ 

Esto es bastante simple que podemos alinear

$key =~ /(?<![\w~])$match(?![\w~])/ 
+0

Gracias esto hace lo que quiero, aunque es muy largo. $ key = ~/(?: (? <= [\ w ~]) (?! [\ w ~]) | (?

+1

Si necesito incluir otros caracteres especiales se agregarían así [\ w ~ '] –

+1

yup. xxxxxxxxxx – ikegami

4

Suponiendo que no es necesario para comprobar el contenido de $match (es decir, que siempre contiene un identificador válido) se puede escribir este

$key =~ /(?<![~\w])$match(?![~\w])/ 

que simplemente se comprueba que la cadena de $match no es precedido o seguido de caracteres alfanuméricos, guiones bajos o tildes

Cuestiones relacionadas