Complemento Unicode para XRegExp

Actualización: Muchos de los detalles que se describen a continuación ahora están desactualizados. Obtenga la última versión del complemento Unicode para XRegExp .

Lancé un complemento simple para XRegExp (mi biblioteca de expresiones regulares de JavaScript) que agrega soporte para las propiedades Unicode y bloquea las expresiones regulares de JavaScript. Utiliza la base de datos de caracteres Unicode 5.1, que es la última versión.

El complemento Unicode habilita las siguientes propiedades/categorías Unicode en cualquier XRegExp:

  • \p{L} — Carta
  • \p{M} — Marca
  • \p{N} — Número
  • \p{P} — Puntuación
  • \p{S} — Símbolo
  • \p{Z} — Separador
  • \p{C} — Otros (códigos de control, formato, uso privado, sustitutos y no asignados)

También habilita los 136 bloques en los que se dividen los puntos de código U+0000 a U+FFFF. Los bloques Unicode usan el prefijo "In", siguiendo a Perl y Java (.NET usa "Is"). Estos son los bloques admitidos en orden alfabético:

  • \p{InAlphabeticPresentationForms}
  • \p{InArabic}
  • \p{InArabicPresentationFormsA}
  • \p{InArabicPresentationFormsB}
  • \p{InArabicSupplement}
  • \p{InArmenian}
  • \p{InArrows}
  • \p{InBalinese}
  • \p{InBasicLatin}
  • \p{InBengali}
  • \p{InBlockElements}
  • \p{InBopomofo}
  • \p{InBopomofoExtended}
  • \p{InBoxDrawing}
  • \p{InBraillePatterns}
  • \p{InBuginese}
  • \p{InBuhid}
  • \p{InCham}
  • \p{InCherokee}
  • \p{InCJKCompatibility}
  • \p{InCJKCompatibilityForms}
  • \p{InCJKCompatibilityIdeographs}
  • \p{InCJKRadicalsSupplement}
  • \p{InCJKStrokes}
  • \p{InCJKSymbolsandPunctuation}
  • \p{InCJKUnifiedIdeographs}
  • \p{InCJKUnifiedIdeographsExtensionA}
  • \p{InCombiningDiacriticalMarks}
  • \p{InCombiningDiacriticalMarksforSymbols}
  • \p{InCombiningDiacriticalMarksSupplement}
  • \p{InCombiningHalfMarks}
  • \p{InControlPictures}
  • \p{InCoptic}
  • \p{InCurrencySymbols}
  • \p{InCyrillic}
  • \p{InCyrillicExtendedA}
  • \p{InCyrillicExtendedB}
  • \p{InCyrillicSupplement}
  • \p{InDevanagari}
  • \p{InDingbats}
  • \p{InEnclosedAlphanumerics}
  • \p{InEnclosedCJKLettersandMonths}
  • \p{InEthiopic}
  • \p{InEthiopicExtended}
  • \p{InEthiopicSupplement}
  • \p{InGeneralPunctuation}
  • \p{InGeometricShapes}
  • \p{InGeorgian}
  • \p{InGeorgianSupplement}
  • \p{InGlagolitic}
  • \p{InGreekandCoptic}
  • \p{InGreekExtended}
  • \p{InGujarati}
  • \p{InGurmukhi}
  • \p{InHalfwidthandFullwidthForms}
  • \p{InHangulCompatibilityJamo}
  • \p{InHangulJamo}
  • \p{InHangulSyllables}
  • \p{InHanunoo}
  • \p{InHebrew}
  • \p{InHighPrivateUseSurrogates}
  • \p{InHighSurrogates}
  • \p{InHiragana}
  • \p{InIdeographicDescriptionCharacters}
  • \p{InIPAExtensions}
  • \p{InKanbun}
  • \p{InKangxiRadicals}
  • \p{InKannada}
  • \p{InKatakana}
  • \p{InKatakanaPhoneticExtensions}
  • \p{InKayahLi}
  • \p{InKhmer}
  • \p{InKhmerSymbols}
  • \p{InLao}
  • \p{InLatin1Supplement}
  • \p{InLatinExtendedA}
  • \p{InLatinExtendedAdditional}
  • \p{InLatinExtendedB}
  • \p{InLatinExtendedC}
  • \p{InLatinExtendedD}
  • \p{InLepcha}
  • \p{InLetterlikeSymbols}
  • \p{InLimbu}
  • \p{InLowSurrogates}
  • \p{InMalayalam}
  • \p{InMathematicalOperators}
  • \p{InMiscellaneousMathematicalSymbolsA}
  • \p{InMiscellaneousMathematicalSymbolsB}
  • \p{InMiscellaneousSymbols}
  • \p{InMiscellaneousSymbolsandArrows}
  • \p{InMiscellaneousTechnical}
  • \p{InModifierToneLetters}
  • \p{InMongolian}
  • \p{InMyanmar}
  • \p{InNewTaiLue}
  • \p{InNKo}
  • \p{InNumberForms}
  • \p{InOgham}
  • \p{InOlChiki}
  • \p{InOpticalCharacterRecognition}
  • \p{InOriya}
  • \p{InPhagspa}
  • \p{InPhoneticExtensions}
  • \p{InPhoneticExtensionsSupplement}
  • \p{InPrivateUseArea}
  • \p{InRejang}
  • \p{InRunic}
  • \p{InSaurashtra}
  • \p{InSinhala}
  • \p{InSmallFormVariants}
  • \p{InSpacingModifierLetters}
  • \p{InSpecials}
  • \p{InSundanese}
  • \p{InSuperscriptsandSubscripts}
  • \p{InSupplementalArrowsA}
  • \p{InSupplementalArrowsB}
  • \p{InSupplementalMathematicalOperators}
  • \p{InSupplementalPunctuation}
  • \p{InSylotiNagri}
  • \p{InSyriac}
  • \p{InTagalog}
  • \p{InTagbanwa}
  • \p{InTaiLe}
  • \p{InTamil}
  • \p{InTelugu}
  • \p{InThaana}
  • \p{InThai}
  • \p{InTibetan}
  • \p{InTifinagh}
  • \p{InUnifiedCanadianAboriginalSyllabics}
  • \p{InVai}
  • \p{InVariationSelectors}
  • \p{InVerticalForms}
  • \p{InYijingHexagramSymbols}
  • \p{InYiRadicals}
  • \p{InYiSyllables}

De acuerdo con el estándar Unicode, las mayúsculas y minúsculas, los espacios, los guiones y los guiones bajos se ignoran al comparar nombres de bloques. Por lo tanto, \p{InLatinExtendedA} , \p{InLatin Extended-A} y \p{in latin extended a} son todos equivalentes.

Todas las propiedades y bloques se pueden invertir usando una p mayúscula. Por ejemplo, \P{N} coincide con cualquier punto de código que no esté en la categoría Número. \P{InArabic} coincide con puntos de código que no están en el bloque árabe.

IMPORTANTE: Actualmente no se admite el uso de propiedades o bloques Unicode dentro de las clases de caracteres. Sin embargo, puede emular su uso con alternancia y/o anticipación, como se muestra a continuación.

En lugar de: Usar:
[\p{N}] \p{N}
[\p{N}a-z~] (?:\p{N}|[a-z~])
[\p{N}\P{Z}] (?:\p{N}|\P{Z})
[\p{N}\P{Z}a-z~] (?:\p{N}|\P{Z}|[a-z~])
[^\p{N}] \P{N}
[^\p{N}a-z~] (?:(?!\p{N})[^a-z~])
[^\p{N}\P{Z}] (?:(?!\p{N}|\P{Z})[\S\s])
[^\p{N}\P{Z}a-z~] (?:(?!\p{N}|\P{Z})[^a-z~])

Además, las subcategorías Unicode como \p{Nd} y scripts como \p{Latin} actualmente no son compatibles. (A modo de comparación, las propuestas de expresiones regulares de ECMAScript 4 incluyen propiedades/categorías Unicode, pero no scripts o bloques De los principales tipos de expresiones regulares, solo Perl y PCRE admiten scripts Unicode).

Teniendo en cuenta el soporte integral que tiene XRegExp para otras funciones extendidas de expresiones regulares, no estoy satisfecho con las limitaciones descritas anteriormente. Con suerte, esto será útil para algunas personas de todos modos. Si hay interés en este complemento, puedo agregar las funciones que faltan en futuras versiones.

El complemento Unicode registra solo 5,2 KB después de la minificación (usando el compresor YUI) y gzipping. Esto se agregaría a los 2,5 KB de XRegExp, lo que le brinda muchas más bondades de expresiones regulares de JavaScript.

Para activar este complemento, simplemente cárguelo después de cargar XRegExp 0.6.1 o posterior.

<script src="xregexp.js"></script>
<script src="xregexp-unicode.js"></script>
<script>
	var unicodeWord = new XRegExp("^\\p{L}+$");
	alert(unicodeWord.test("Русский")); // true
</script>

Descargue el complemento Unicode .