Regex ותכונות#
לאחר שהמחרוזות שלך מפוענחות, regex עובד על תווים - ומנוע ה-regex של פרל יודע על Unicode. \w מתאים לכל תו-מילה של Unicode, התאמה ללא רגישות לאותיות גדולות/קטנות מקפלת על פני כתבים, ו-\p{…} נותן לך גישה למסד הנתונים המלא של תווי Unicode. פרק זה מכסה את ההרגלים שדרושים לך כדי שזה יעבוד באמינות.
תווים, לא בתים#
על מחרוזת טקסט, כל מטא-תו של regex מדבר בתווים:
use utf8;
my $s = "café"; # 4 characters
$s =~ /^.{4}$/; # matches
$s =~ /^.{5}$/; # does not
על מחרוזת בינארית, אותם מטא-תווים מונים בתים. בדרך כלל זה לא מה שאתה רוצה - אם אתה מוצא את עצמך כותב regex מול בתים שמחזיקים טקסט, פענח תחילה.
\w, \d, \s והחברים#
במצב ברירת המחדל (Unicode), קיצורים אלה מתאימים למקבילות ה-Unicode שלהם:
\w- אותיות, ספרות וקו תחתון מכל כתב.\d- ספרות עשרוניות מכל כתב (לא רק0–9).\s- רווח-לבן מכל סוג, כולל רווח לא-שביר U+00A0.
use utf8;
"café" =~ /^\w+$/; # matches
"café" =~ /^[a-z]+$/; # does not - é is outside
"\x{0660}\x{0661}\x{0662}" =~ /^\d+$/; # matches Arabic-Indic digits
כשאתה רוצה את המשמעות הישנה של ASCII-בלבד, הוסף את משנה /a - ראה Modifiers להלן.
מחלקות התכונה \p{…}#
\p{PROPERTY} מתאים לכל תו בעל תכונת Unicode בעלת שם. שמות התכונות נשאבים ממסד הנתונים של תווי Unicode; אלה השימושיים בדרך כלל הם:
\p{Letter}, קיצור\p{L}- כל אות.\p{Lu},\p{Ll},\p{Lt}- אותיות גדולות, קטנות, וכותרת.\p{Number},\p{N},\p{Nd}- כל המספרים, ספרות עשרוניות.\p{Punct},\p{P}- סימני פיסוק.\p{Space},\p{Zs}- רווח-לבן, מפרידי רווח.\p{ASCII}- 128 נקודות הקוד של ASCII.\p{Script=Greek}- כל תו השייך לכתב היווני. כל שם כתב מנתוני Unicode עובד כאן.\p{Block=Cyrillic}- כל תו בבלוק הקירילי. (כתב ובלוק שונים זה מזה: כתב הוא מערכת הכתיבה שאליה תו שייך; בלוק הוא טווח נקודות-הקוד שבו הוא חי.)
\P{…} הוא השלילה - כל תו ללא אותה תכונה.
use utf8;
my $s = "Γειά σου, κόσμε";
my @greek_letters = $s =~ /(\p{Script=Greek})/g;
scalar @greek_letters; # 12
הקטלוג המלא של התכונות מגיע עם פרל; perldoc perluniprops מונה כל שם שהמנוע מקבל.
משנים: /a, /u, /l, /aa#
ארבעה משנים משנים את האופן שבו מחלקות תווים מפרשות את עצמן:
/u- מצב Unicode.\wמתאים לתווי-מילה של Unicode,\dמתאים לספרות עשרוניות של Unicode, קיפול אותיות משתמש בכללי Unicode. זוהי ברירת המחדל על מחרוזות טקסט./a- ASCII mode.\wbecomes[A-Za-z0-9_],\dbecomes[0-9],\sbecomes[ \t\n\r\f]. Case folding is still Unicode -/foo/aistill matchesFÖOthroughÖif you wrotefoo- which is almost never what you want when you reached for/a./aa- ASCII קפדני./aבתוספת קיפול אותיות מוגבל ל-ASCII./foo/aaiמתאים ל-FOOאך לא ל-FÖO. השתמש בזה כשאתה רוצה התאמת מזהה מול מפרט הידוע כ-ASCII (שמות כותרות HTTP, מילות-מפתח של פקודות)./l- מצב locale. נדחה ל-locale הנוכחי של POSIX. כמעט אף פעם אינו מה שאתה רוצה בתוכנית מודעת-Unicode; מוזכר רק כדי שתוכל לזהותו כשבסיס קוד אחר משתמש בו.
use utf8;
"café" =~ /\w+/; # matches whole word (Unicode)
"café" =~ /\w+/a; # matches "caf" (ASCII only)
"FOO" =~ /foo/ai; # matches (case fold anywhere)
"FÖO" =~ /foo/aa; # does not - strict ASCII
כלל אצבע: מצב ברירת המחדל נכון לטקסט; עבור ל-/aa כשאתה מפרש פרוטוקול שמוגדר ב-ASCII ורוצה לדחות תווים שאינם ASCII שהוברחו פנימה.
התאמה ללא רגישות לאותיות גדולות/קטנות#
/i מקפל את שני צדי ההתאמה באמצעות טבלאות קיפול-אותיות של Unicode. זה מטפל בזוגות האירופיים המובהקים (é/É, ß/SS), ובאלה הפחות מובהקים (İ/i̇, fi/fi).
use utf8;
"Ångström" =~ /ångström/i; # matches
"STRASSE" =~ /straße/i; # matches - ß folds to SS
לקיפול אותיות של בתים מילוליים (המשמעות הישנה של /i ב-ASCII), השתמש ב-/iaa.
נקודות קוד בעלות שם#
\N{...} נוקב בשם תו Unicode, אם בשמו הרשמי ואם במספר נקודת-הקוד שלו:
use charnames ();
"\N{LATIN SMALL LETTER E WITH ACUTE}" eq "\x{e9}"; # true
"\N{U+00E9}" eq "\x{e9}"; # the same character
\N{U+HEX} עובד ללא כל פרגמה; השמות הארוכים עוברים דרך המודול charnames, הנטען אוטומטית בתוך escape של \N{...} (או במפורש עם use charnames qw(:full)). בתבנית, \N{...} שימושי כשאתה רוצה שהמקור יתעד לאיזה תו אתה מתכוון מבלי להסתמך על כך שהקורא יזהה escape הקסדצימלי:
"café" =~ /caf\N{LATIN SMALL LETTER E WITH ACUTE}/; # matches
פיצול וצירוף#
split ו-substr שניהם מונים ביחידות של המחרוזת שעליה הם פועלים. על מחרוזת טקסט, המניין הוא בתווים:
use utf8;
my $s = "a,é,b,Ω";
my @parts = split /,/, $s; # ("a", "é", "b", "Ω")
substr($s, 2, 1); # "é"
על מחרוזת בינארית, אותן פעולות מונות בתים. זהו הבאג העדין הנפוץ ביותר - בסיס קוד ישן שפענח קלט בפונקציה אחת אך אינדקס את התוצאה באחרת, שנבנה לפני שצעד הפענוח הוכנס.