טוב, זה דבר די מגניב שאפשר לעשות בביטויים רגולריים (שזה התרגום ל regular expression בעברית, יא נודניקים) וזה די העיף לי את הראש. מה הערך של זה? יש לזה ערך רב ובכל מקרה, כיף ואפילו טוב לדעת. נתחיל? בטח שנתחיל.
אז את הפלאג של u לביטויים רגולריים אתם מכירים? זה מאפשר לנו תמיכה ביוניקוד. למשל, הקוד המדהים הבא:
let a = /?$/u.test('?'); // true
טוב, מצחיק? כן. משעשע? כן. שימושי? לסבתא בערך. אבל מה דעתכם למשל על קוד שמגלה אם מחרוזת הטקסט הזו בעברית?
let a = /^\p{Script=Hebrew}+$/u.test('עברית'); // true
תפסתי את תשומת הלב שלכם? הדבר הזה נכנס עכשיו ב-ES2018 – תכונות יוניקוד או unicode properties. ויש כל כך הרבה מהן! הפורמט הוא פשוט ביותר:
\p{LoneUnicodePropertyNameOrValue}
האותיות p\ ואז סוגריים מסולסלות שיש בתוכן את התכונות של היוניקוד – ניתן עם שם התכונה והערך או רק תכונה מסוימת.
let a = /\p{General_Category=Lowercase_Letter}$/u.test('a'); // true
יוניקוד זה עולם ומלואו, אז אני אנסה להכנס כאן לפוקוס. בקישור הזה יש פירוט מלא של תכונות unicode.
בגדול יש לנו כמה קטגוריות של תכונות.
הראשונה היא script. אותה כבר ראינו. Unicode Scripts היא
let a = /^\p{Script=Greek}+$/u.test('μετά') // true
בגדול מדובר במערכות כתב. לא באיזו דרך ממבו ג׳מבו למצוא שפה. הביטוי הרגולרי מוודא שהאותיות הן בטווח מסוים במערכת הכתב. כלומר אם תכניסו רווח, שנמצא בטווח של האותיות הלטיניות, הוא לא יזהה אותו כעברית.
let a = /^\p{Script=Hebrew}+$/u.test('שתי מילים') // false
אם אנחנו רוצים להיות יותר ספציפיים בטווחים, אפשר לעבור לקטגוריה השניה – General_Category. כאן אפשר למצוא דברים מאוד מעניינים כמו מקפים למשל (כל הסוגים).
let a = /^\p{General_Category=Dash_Punctuation}+$/u.test('-־') // true
או למשל סימני מטבעות:
let a = /^\p{General_Category=Currency_Symbol}+$/u.test('$') // true
אני רק מזכיר שמדובר בתו אחד, אפשר לשלב את זה איפה שרוצים. למשל, אם אני רוצה לתפוס מספר וסוג מטבע (למשל 400$ או 400₪) אז אני אעשה משהו כזה:
let a = /^\p{General_Category=Currency_Symbol}[0-9]+$/u.test('₪400') // true
כאשר תו היוניקוד הוא רק חלק (קטן) מתוך הביטוי הרגולרי המלא.
ניתן להשתמש באות הגדולה P על מנת לעשות שלילה – למשל כל תו שהוא לא סימן כספי:
let a = /^\P{General_Category=Currency_Symbol}$/u.test('₪') // false
ה-P הגדולה היא בעצם שלילה.
התוספת הזו לתקן מעשירה מאוד את עניין היוניקוד בביטויים רגולריים ונותנת לנו עוד לא מעט כוח בכל מה שקשור לעבודה עם ביטויים רגולריים מדויקים יותר ונרחבים יותר.
2 תגובות
היה שווה שלוש דקות ?
יש ציטוט יפה ועתיק:
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
– Jamie Zawinski