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 - ספרות עשרוניות מכל כתב (לא רק 09).

  • \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. \w becomes [A-Za-z0-9_], \d becomes [0-9], \s becomes [ \t\n\r\f]. Case folding is still Unicode - /foo/ai still matches FÖO through Ö if you wrote foo - 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), ובאלה הפחות מובהקים (İ/, /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);                        # "é"

על מחרוזת בינארית, אותן פעולות מונות בתים. זהו הבאג העדין הנפוץ ביותר - בסיס קוד ישן שפענח קלט בפונקציה אחת אך אינדקס את התוצאה באחרת, שנבנה לפני שצעד הפענוח הוכנס.