Unicode Plugin pro XRegExp

Aktualizace: Mnohé z níže popsaných podrobností jsou nyní zastaralé. Získejte nejnovější verzi pluginu Unicode pro XRegExp .

Vydal jsem jednoduchý plugin pro XRegExp (moje knihovna regulárních výrazů JavaScriptu), který přidává podporu pro vlastnosti a bloky Unicode do regulárních výrazů JavaScriptu. Používá znakovou databázi Unicode 5.1, což je nejnovější verze.

Zásuvný modul Unicode umožňuje následující vlastnosti/kategorie Unicode v libovolném XRegExp:

  • \p{L} — Dopis
  • \p{M} — Mark
  • \p{N} — Číslo
  • \p{P} — Interpunkce
  • \p{S} — Symbol
  • \p{Z} — Separátor
  • \p{C} — Jiné (kontrola, formát, soukromé použití, náhradní a nepřiřazené kódy)

Umožňuje také všech 136 bloků, na které jsou rozděleny kódové body U+0000 až U+FFFF. Bloky Unicode používají předponu „In“ po Perlu a Javě (.NET používá „Is“). Zde jsou podporované bloky v abecedním pořadí:

  • \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}

V souladu se standardem Unicode se při porovnávání názvů bloků ignorují velká a malá písmena, mezery, pomlčky a podtržítka. Proto \p{InLatinExtendedA} , \p{InLatin Extended-A} a \p{in latin extended a} jsou všechny rovnocenné.

Všechny vlastnosti a bloky lze invertovat pomocí velkého p. Například \P{N} odpovídá libovolnému bodu kódu, který není v kategorii Číslo. \P{InArabic} odpovídá kódovým bodům, které nejsou v arabském bloku.

DŮLEŽITÉ: Použití vlastností nebo bloků Unicode v rámci znakových tříd není aktuálně podporováno. Můžete však napodobit jejich použití se střídáním a/nebo s předstihem, jak je uvedeno níže.

Místo: Použijte:
[\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~])

Navíc podkategorie Unicode jako \p{Nd} a skripty jako \p{Latin} aktuálně nejsou podporovány. (Pro srovnání, návrhy regulárních výrazů ECMAScript 4 zahrnují vlastnosti/kategorie Unicode, ale nikoli skripty nebo bloky. Z hlavních příchutí regulárních výrazů pouze Perl a PCRE podporují skripty Unicode.)

Vzhledem ke komplexní podpoře, kterou má XRegExp pro další, rozšířené funkce regulárních výrazů, nejsem spokojen s výše popsanými omezeními. Snad se to bude i tak některým lidem hodit. Pokud bude o tento plugin zájem, mohu chybějící funkce přidat do budoucích verzí.

Zásuvný modul Unicode má po minifikaci (pomocí YUI Compressor) a gzipování pouhých 5,2 kB. To by bylo přidáno k 2,5 KB samotného XRegExp, což vám poskytuje mnohem více dobrých regulárních výrazů JavaScriptu.

Chcete-li aktivovat tento plugin, jednoduše jej načtěte po načtení XRegExp 0.6.1 nebo novější.

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

Stáhněte si plugin Unicode .