2011-09-28 10 views
18

Necesito una expresión regular que coincida con todos los signos de puntuación, como el estándar [,! @ # $%^& *()], pero incluye marcas internacionales como el signo de interrogación español al revés, períodos chinos, etc. Mi google-fu se está quedando corto. ¿Alguien tiene una expresión tan regular a mano que sea compatible con Javascript?¿Expresión regular de Javascript para la puntuación (internacional)?

+1

Teniendo en cuenta lo malo que son las expresiones regulares de JavaScript y el soporte Unicode, no creo que haya nada más que enumerar todos los caracteres que desea incluir. – NullUserException

+4

PD: ¿Cuándo '@ # $%^& *' se convirtieron en signos de puntuación? – NullUserException

+1

desde que aparecieron dos ojos comenzó a aparecer al final de un nombre :-) – RHT

Respuesta

7

Si es posible utilizar un complemento, existe un complemento para JavaScript: XRegExp Unicode plugins. Eso agrega soporte para categorías Unicode, scripts y bloques (yo personalmente solo he leído sobre él, nunca lo he usado).

Con este complemento debería ser posible utilizar categorías Unicode como \p{P} como se explica en regular-expressions.info.

Actualización: Bien, lo probé, y parece funcionar bien.

Debe obtener la lib de XRegExp y adicionalmente los complementos de la categoría Unicode Base y Unicode (vinculados arriba).

<script src="xregexp.js"></script> 
<script src="addons/unicode-base.js"></script> 
<script src="addons/unicode-categories.js"></script> 
<script> 
    var unicodePunctuation = XRegExp("^\\p{P}+$"); 

    alert(unicodePunctuation.test("?.,;!¡¿。、·")); // true 
</script> 

Las alertas anteriores true. Incluí algunos signos de puntuación en español y chino en mi cadena de prueba, "?.,;!¡¿。、·".

+0

Esto se ve bastante prometedor, aunque siempre estoy indeciso para hinchar mi aplicación de Javascript con otra biblioteca. Volveré a verificar una vez que confirme que funciona para mi propósito. –

+0

Gracias. Aquí hay una JSBin del código (desplácese hasta la parte inferior y también vea la consola de Chrome) http://jsbin.com/uFiNeDOn/3/edit?js,console –

2

Bueno ... idk qué tan extensa que sería, pero se puede usar esto:

[^\w\s\n\t] 
+0

. La única cuestión es que el carácter '_' está incluido en' \ w' . Además, ¿se permitirían las letras unicode (como 'ö') como falsos positivos? – sdleihssirhc

+2

'\ s' incluye tanto' \ n' como '\ t', y esto también coincidiría con los caracteres de las palabras que no son ASCII, los caracteres de control, los caracteres de moneda y otros caracteres sin puntuación. –

+0

Otros caracteres Unicode que se incluyen como falsos positivos es mi principal problema actual. Supongo que un problema equivalente para mí es encontrar una buena expresión regular que sea el equivalente internacional de \ w (y por lo tanto \ W) –

2

Su expresión regular sería algo como ...

/[,[email protected]#$%^&*()\u9999]/ 

Donde reemplazar cada \u9999 con el punto de código Unicode para los otros caracteres de puntuación.

Si puede encontrar un grupo en un rango , puede especificarlo con el operando de rango -, p. \u9990-\u9999.

Por lo que yo sé, no puede usar algo como \pP en expresiones regulares de JavaScript.

+0

. No es necesario que hagas una Caracteres: aún puede hacer rangos como '[\ u9000- \ u9999]' (es un ejemplo de sintaxis, no tiene idea de qué caracteres podría representar). –

+1

@PeterBoughton: Acabo de editar eso en :) – alex

6

Agregando a la respuesta de @ stema (https://stackoverflow.com/a/7578937/114140) ... aquí está la expresión regular como una cadena (por lo que no necesita hinchar su proyecto con XRegExp).

!-#%-\x2A,-/:;\[email protected]\x5B-\x5D_\x7B}\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E3B\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65 

he utilizado esto en mi propio proyecto con algunas adiciones ...

// any kind of punctuation character (including international e.g. Chinese and Spanish punctuation) 
    // author: http://www.regular-expressions.info/unicode.html 
    // source: https://github.com/slevithan/xregexp/blob/41f4cd3fc0a8540c3c71969a0f81d1f00e9056a9/src/addons/unicode/unicode-categories.js#L142 
    // note: XRegExp unicode output taken from http://jsbin.com/uFiNeDOn/3/edit?js,console (see chrome console.log), then converted back to JS escaped unicode here http://rishida.net/tools/conversion/, then tested on http://regexpal.com/ 
    // suggested by: https://stackoverflow.com/a/7578937 
    // added: extra characters like "$", "\uFFE5" [yen symbol], "^", "+", "=" which are not consider punctuation in the XRegExp regex (they are currency or mathmatical characters) 
    // added: \u3000-\u303F Chinese Punctuation for good measure 
    var regex_characters_to_remove = /[\$\uFFE5\^\+=`~<>{}\[\]|\u3000-\u303F!-#%-\x2A,-/:;\[email protected]\x5B-\x5D_\x7B}\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E3B\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]+/g 
0

de Python para esta expresión regular para eliminar desde el principio y el fin de cualquier tipo de signos de puntuación:

import re 
def cleanspecialcharacters(str): 
    regex = re.compile((
    '^[/\"_\(\)&*\$¥\^\+=`~<>\{\}\[\]\|\-!#%\,\:;@¡§«¶·»¿;·՚-՟։֊؉،॥॰෴๏๚๛༄-༒༔༺-༽྅჻፠-፨᐀᙭᙮។-៖៘-៚‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎、〃〈-【】〔-〟〰〽゠・﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・〔〕《》]*|' 
    '([/\"_\(\)&*\$¥\^\+=`~<>\{\}\[\]\|\-!#%\,\:;@¡§«¶·»¿;·՚-՟։֊؉،॥॰෴๏๚๛༄-༒༔༺-༽྅჻፠-፨᐀᙭᙮។-៖៘-៚‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎、〃〈-【】〔-〟〰〽゠・﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・〔〕《》])*$')) 
    str = regex.sub('', str) 
    return str 
Cuestiones relacionadas