Saltar al contenido

Ayuda de Regex – Caracteres de escape y método de comparación

Solución:

La solución más sencilla es utilizar el W carácter como su expresión completa, coincide con cualquier carácter que no sea una palabra. Desafortunadamente, esta solución también coincidiría con cualquier carácter de espacio en blanco e ignoraría el carácter de subrayado (_).

Aquí está la expresión que usaría:

(_|[^ws])

¿Qué significa?

  • 1er grupo de captura (_|[^ws])

    Coincide con cualquiera de las alternativas

    • 1ra alternativa _
      • _ coincide con el personaje _ literalmente (distingue entre mayúsculas y minúsculas)
    • 2da alternativa [^ws]
      • Coincidir con un solo carácter que no está presente en la lista a continuación [^ws]
      • w coincide con cualquier carácter de palabra (igual a [a-zA-Z0-9_])
      • s coincide con cualquier carácter de espacio en blanco (igual a [rntfv ])

Aquí hay unos ejemplos:

String expression = '(_|[^\w\s])';

String allPunctuation = '[email protected]#$%^*()_+|}{":?><`=;/.,][-'\';
String input1 = 'This is a test!', output1 = 'This is a test';
String input2 = 'This is a test...', output2 = 'This is a test';
String input3 = '([{This_is_a_test}])', output3 = 'Thisisatest';

system.assertEquals('', allPunctuation.replaceAll(expression, ''));
system.assertEquals(output1, input1.replaceAll(expression, ''));
system.assertEquals(output2, input2.replaceAll(expression, ''));
system.assertEquals(output3, input3.replaceAll(expression, ''));

Dado el ejemplo 3, es posible que desee cambiar las cosas y reemplazar los guiones bajos con caracteres de espacio. Entonces podrías simplificar un poco:

String sanitize(String name)
{
    if (name == null) return name;
    return name.replaceAll('[^\w\s]', '')
        .replaceAll('_', ' ').trim();
}

String allPunctuation = '[email protected]#$%^*()_+|}{":?><`=;/.,][-'\';
String input1 = 'This is a test!     ', output1 = 'This is a test';
String input2 = 'This is a test...   ', output2 = 'This is a test';
String input3 = '([{This_is_a_test}])', output3 = 'This is a test';

system.assertEquals('', sanitize(allPunctuation));
system.assertEquals(output1, sanitize(input1));
system.assertEquals(output2, sanitize(input2));
system.assertEquals(output3, sanitize(input3));

Puede hacer coincidir toda la puntuación usando \p{Punct}, como se menciona en la clase Pattern, que coincide con:

!"#$%&'()*+,-./:;<=>[email protected][]^_`{|}~

Por ejemplo, el siguiente código da como resultado una cadena vacía:

Cadena s = "[email protected]# $% ^ * () _ + |} {":?> <` =; /.,][-"\';
System.debug(s.replaceAll('\p{Punct}',''));

Note that the "escapes" are not disappearing, they're being compiled. If you want a literal backslash escape, you have to escape it twice:

String s="[email protected]# $% ^ * () _ + |} {":?> <` =; /.,][- \ "\\ ';

Dónde \' resultados en el motor de patrón / matcher / regexp viendo ', y \\ da como resultado que el motor vea \.

La solución de Adrian también funciona, pero creo que p{Punct} es un poco más explícito al declarar intención de su código (para que coincida con cualquier puntuación).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *