בודק ביטויים רגולריים
בדקו ביטוי רגולרי בזמן אמת: התאמות וקבוצות לכידה, תצוגה מקדימה של החלפות ופיצול טקסט — בסמנטיקה של JavaScript.
הזינו תבנית וטקסט כדי לראות תוצאות
מה הכלי הזה עושה
ביטוי רגולרי הוא שפה דחוסה לתיאור תבניות טקסט, והדרך האמינה היחידה לכתוב אחד היא לצפות בו רץ על טקסט אמיתי. הבודק הזה עושה בדיוק את זה, בזמן אמת, בשלושה מצבים. התאמה מציגה כל מקום שבו התבנית מתאימה, מודגש בתוך הטקסט, עם כל קבוצת לכידה מפורטת מתחת. החלפה מציגה מראש מה String.replace יפיק, כולל הפניות $1 ו-lt;name>. פיצול מראה איך String.split יחתוך את הטקסט — כולל החלקים שאנשים כמעט אף פעם לא מנחשים נכון, כמו מפרידים לכודים שמופיעים בתוצאה.
התבנית רצה על מנוע ה-JavaScript של הדפדפן שלכם עצמו, לא על חיקוי שלו. מה שמתאים כאן הוא בדיוק מה שיתאים בקוד ה-JavaScript שלכם, אחד לאחד, כי אותו מנוע בדיוק עושה את העבודה.
איך קוראים את תוצאות ההתאמה
כל התאמה מודגשת בטקסט הבדיקה ומפורטת מתחתיו עם המיקום שלה — היסטי התווים שבהם היא מתחילה ונגמרת. אם התבנית מכילה קבוצות לכידה, כל קבוצה מופיעה תחת ההתאמה שלה עם הערך שנלכד. הקבוצות ממוספרות לפי הסוגר הפותח שלהן, משמאל לימין, בדיוק כפי שהמנוע ממספר אותן עבור $1, $2 והפניות-אחורה; קבוצה בשם מציגה את שמה ליד מספרה. קבוצה שלא השתתפה בהתאמה — למשל הצד המפסיד של תבנית "או" — מסומנת ככזו במקום להיות מוצגת כמחרוזת ריקה, כי עבור הקוד שלכם אלה דברים שונים: undefined לעומת "".
תבנית יכולה להתאים באופן לגיטימי לאפס תווים — ^, \b או חלופה ריקה כולם מסוגלים לכך. התאמות באורך אפס לא מדגישות שום דבר, ולכן הכלי מסמן את המיקום בקו דק במקום להשאיר אתכם תוהים לאן ההתאמה נעלמה.
הדגלים
דגלים משנים את התנהגות התבנית כולה, ושניים מהם אחראים לרוב הבלבול סביב regex:
- g (גלובלי) — מציאת כל ההתאמות, לא רק הראשונה. בלעדיו, התאמה מציגה תוצאה אחת והחלפה משנה מופע אחד. זה הדגל שהכי הרבה שוכחים.
- i (התעלמות מרישיות) — אותיות מתאימות בלי קשר לגודל שלהן.
- m (רב-שורתי) — ^ ו-$ מתאימים בתחילת ובסוף כל שורה, לא רק של הטקסט כולו.
- s (dotAll) — הנקודה תופסת גם תווי שורה חדשה. בלעדיו, . נעצרת בכל מעבר שורה.
- u (Unicode) — התבנית עובדת בנקודות קוד, כך שאמוג׳י ותווים אחרים מחוץ לטווח הבסיסי מתנהגים נכון, ו-escapes של תכונות \p{…} נעשים זמינים.
- y (צמוד) — ההתאמה חייבת להתחיל בדיוק היכן שהקודמת נגמרה. שימושי לטוקנייזרים; מפתיע בכל מקום אחר.
- d (מיקומים) — המנוע מתעד את המיקומים המדויקים של כל קבוצה. לא משנה דבר לגבי מה מתאים.
הפניות בטקסט ההחלפה
טקסט ההחלפה לא נלקח כפשוטו — קומץ רצפי $ מורחבים עבור כל התאמה. $1 עד $9 מכניסים את מה שהקבוצות הממוספרות לכדו, lt;name> מכניס קבוצה בשם, amp; מכניס את ההתאמה כולה, ו-$ מפיק סימן דולר מילולי. כל השאר מועתק כמו שהוא.
"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"התנהגות אחת של JavaScript ששווה להפנים: בלי הדגל g, replace משנה רק את המופע הראשון. זו לא מוזרות של הכלי — זה מה שהקוד שלכם יעשה. הכלי מציג רמז כש-g כבוי, כדי שההחלפה הבודדת לא תיראה כמו באג.
איך split באמת מתנהג
ל-String.split עם regex יש שתי התנהגויות שמפתיעות באופן קבוע גם מפתחים מנוסים, ומצב הפיצול קיים במידה רבה כדי להפוך אותן לגלויות. ראשית, אם התבנית מכילה קבוצות לכידה, מה שהן לוכדות נשזר לתוך מערך התוצאה בין החלקים — פיצול של "a,b" לפי (,) מפיק שלושה חלקים: a, הפסיק, b. שנית, התאמות ממש בתחילת הטקסט או בסופו, או שתי התאמות צמודות, מפיקות מחרוזות ריקות בתוצאה — והכלי מציג אותן במפורש במקום להסתיר.
"a,b".split(/(,)/) // → ["a", ",", "b"] ",a,".split(/,/) // → ["", "a", ""]
תבניות בורחות נעצרות, לא סובלים אותן
יש תבניות שהן מלכודות. כמת מקונן כמו (a+)+ שמנוסה מול מחרוזת ארוכה שכמעט מתאימה מכריח את המנוע לנסות מחדש מספר מעריכי של צירופים לפני שהוא מוותר — לזה קוראים נסיגה קטסטרופלית (catastrophic backtracking), והיא יכולה להקפיא לשונית דפדפן לדקות. הכלי מריץ את התבנית שלכם ב-thread נפרד (worker) ועוצר אותה אחרי שתי שניות, כך שתבנית בורחת עולה לכם הודעה במקום דף קפוא. אם קיבלתם את ההודעה, חפשו בתבנית כמתים מקוננים או חלופות חופפות; התיקון הוא בדרך כלל לוודא שהחזרה הפנימית והחיצונית לא יכולות להתאים לאותו קטע טקסט.
כמו בכל כלי באתר הזה, התבנית והטקסט לעולם לא עוזבים את המכשיר שלכם — ה-worker הוא חלק מהדף, לא שרת.
שאלות נפוצות
- באיזה ניב regex משתמש הבודק?
- JavaScript (ECMAScript), כי התבנית רצה על המנוע של הדפדפן עצמו. קבוצות בשם, lookbehind ו-escapes של תכונות Unicode \p{…} כולם עובדים כמו ב-JavaScript מודרני. תבניות מ-PCRE או Python לרוב עוברות, אבל מבנים ש-JavaScript לא מכירה — כמתים רכושניים (possessive), קבוצות אטומיות, \A ו-\z — יידחו או יתפרשו אחרת.
- למה התבנית שלי מוצאת רק התאמה אחת?
- כמעט תמיד: הדגל g כבוי. בלעדיו JavaScript נעצרת בהתאמה הראשונה, והחלפה משנה רק את המופע הראשון. סמנו את תיבת ה-g כדי לחפש בכל הטקסט.
- מה המשמעות של «לא השתתפה» עבור קבוצה?
- הקבוצה קיימת בתבנית אבל לא שימשה בהתאמה המסוימת הזו — בדרך כלל כי היא יושבת בענף המפסיד של חלופה, או תחת כמת שהתאים אפס פעמים. בקוד הערך שלה הוא undefined, וזה שונה מלכידה של מחרוזת ריקה, ולכן הכלי מקפיד להבחין בין השניים.
- האם התבנית או הטקסט שלי נשלחים לשרת?
- לא. ההתאמה רצה כולה בדפדפן שלכם, בתוך thread נפרד באותו דף. גם עצירת הבטיחות של שתי השניות נאכפת מקומית — שום דבר שאתם מקלידים לא עוזב את המכשיר.