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 ]
)
- Coincidir con un solo carácter que no está presente en la lista a continuación
- 1ra alternativa
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).