המשימה שגרמה לי לבנות את זה הייתה משעממת, וזו בדיוק הסיבה שהיה שווה לבצע אוטומציה לקוח הגיש לי ייצוא של 4,000 שורות שבו כל תאריך נכתב בסגנון אמריקאי, 01/15/2024, והמערכת שהיא נכנסה אליה רצתה ISO, 2024-01-15. חיפוש והחלפה רגיל לא יכול היה לגעת בו, כי לא הייתה מחרוזת קבועה לחפש - התאריכים כולם היו שונים. מה שהם שיתפו זה א צורה: שתי ספרות, קו נטוי, שתי ספרות, קו נטוי, ארבע ספרות. זה בדיוק סוג הדברים שביטוי רגולרי מתאים, ובדיוק סוג הדברים שהחלפת regex משכתבת במעבר אחד. הדבקתי את הקובץ בכלי שריטה, כתבתי ביטוי אחד, וכל פורמט הייצוא התהפך תוך פחות משנייה.
זאת העבודה החינמית החלפת Regex כלי עושה, ואת המדריך הזה הוא הגרסה הארוכה של איך להשתמש בו היטב. אני אכסה מה הוא בעצם תחליף regex, איך ללכוד backreferences הקבוצה מאפשרים לך לבנות מחדש טקסט במקום רק למחוק אותו, מה כל אסימון החלפה מיוחד אומר, ואת הטעויות כי להכשיל אנשים למעלה זה יושב ליד ה בודק רגקס כתבתי על בנפרד - הבוחן אומר לך מה תבנית תואמת, והכלי הזה משכתב את מה שהוא תואם אם ביטויים רגולריים עצמם חדשים עבורך, התחל עם מדריך מלא של כלי קידוד ותחזור.
TL;DR: תחליף regex מתאים טקסט לפי תבנית ומשכתב כל התאמה באמצעות מחרוזת החלפה. עטפו את החלקים שברצונכם לעשות בהם שימוש חוזר בסוגריים כדי ליצור קבוצות ממוספרות, ולאחר מכן הפנו אליהם בהחלפה עם
$1,$2, וכן הלאה - התבנית(\d{4})-(\d{2})-(\d{2})עם החלפה$3/$2/$1סיבובים2024-01-15לתוך15/01/2024. הפעל אתgדגל כדי להחליף כל התאמה, השאר את ההחלפה ריקה כדי למחוק התאמות ולהשתמש$<name>לקבוצות בשם. ה החלפת Regex הכלי פועל כולו בדפדפן שלך ומציג את ספירת ההחלפה בשידור חי.
מהו תחליף regex?
חיפוש והחלפה רגילים עובד על טקסט מילולי: אתה מקליד את המילה המדויקת שאתה מחפש ואת המילה המדויקת לשים במקומה. זה נכשל ברגע שהדבר שאתה רוצה לשנות אינו מחרוזת קבועה אלא תבנית - תאריך בכל אחת ממאה צורות, מספר טלפון, תג HTML, ריצת רווח לבן נגררת, שם משתנה העוקב אחר מוסכמה. ביטוי רגולרי מתאר את התבנית הזו, והחלפת regex מצמידה אותה לתבנית שאומרת כיצד יש לשכתב כל התאמה.
למנגנון שני חצאים. ה דפוס הוא ביטוי רגולרי שהמנוע סורק איתו את הטקסט שלך, ומוצא כל מקום שבו הצורה מתרחשת. ה תחליף האם מחרוזת מוחלפת בכל התאמה במקרה הפשוט ביותר ההחלפה היא טקסט רגיל וכל התאמה הופכת לאותו דבר - שימושי לנורמליזציה, נניח, כל רצף של כרטיסיות ורווחים לרווח בודד המקרה החזק הוא כאשר ההחלפה מתייחסת חזרה לחלקים ממה שהותאם, כך שהפלט בנוי מהקלט במקום להיות קבוע קבוע. זה מה שהופך החלפת regex ממחיקה-והקלדה בוטה לכלי ארגון מחדש אמיתי.
מתחת למכסה המנוע, ה החלפת Regex הכלי משתמש ב-JavaScript RegExp מנוע וה String.prototype.replace שיטה שכל דפדפן ו-Node.js שולחים זה משנה מסיבה מעשית: ההתנהגות שאתה רואה בכלי זהה להתנהגות שתקבל אם תדביק את אותה תבנית והחלפה בקוד JavaScript או TypeScript משלך אין טעם נפרד ללמוד ואין הפתעה כשאתה עובר מכלי השריטה לייצור התחביר החלופי שהכלי מקבל - $1, $&, $<name> והשאר - הוא התחביר המדויק שהתקן מגדיר, מתועד עליו MDN's String.replace reference.
כיצד פועלות הפניות קבוצתיות ללכוד?
זהו הרעיון היחיד השימושי ביותר בהחלפת regex, ושווה להאט עבורו. כאשר אתה שם חלק מתבנית בתוך סוגריים, אתה יוצר א קבוצת לכידת. המנוע זוכר את הטקסט שהקבוצה התאימה, ומספר את הקבוצות משמאל לימין החל מאחת. במחרוזת החלופית, $1 פירושו "הכנס את כל מה שהקבוצה הראשונה תפסה," $2 השני, וכן הלאה עד $99.
דוגמת התאריך הופכת אותו לקונקרטי התבנית (\d{4})-(\d{2})-(\d{2}) בעל שלוש קבוצות: השנה בת ארבע הספרות, החודש הדו ספרתי והיום הדו ספרתי כאשר הוא תואם 2024-01-15, קבוצה אחת מחזיקה 2024, קבוצה שניה מתקיימת 01, וקבוצה שלוש מחזיקה 15. החלפה של $3/$2/$1 לאחר מכן מרכיב מחרוזת חדשה מאותם חלקים בסדר שונה ועם מפרידים שונים, ומייצר 15/01/2024. שום דבר לא נמחק והוקלד מחדש - הפלט ממש נבנה מחדש מהקטעים שנלכדו סדר מחדש את האסימונים, שנה את הפיסוק ביניהם, עטוף אותם בטקסט אחר, ועיצבת מחדש כל תאריך בקובץ בביטוי אחד.
קבוצות שמות הן אותו רעיון עם תוויות קריאות במקום לספור סוגריים, אתה כותב (?<year>\d{4}) ולהתייחס אליו בתחליף כ $<year>. עבור דפוס עם שתיים או שלוש קבוצות המספרים בסדר, אבל ברגע שאתה מלהטט בין חמש או שש, שמות הופכים גם את הדפוס וגם את ההחלפה להרבה יותר קלים לקריאה ולשינוי מאוחר יותר הכלי תומך בשניהם לסירוגין, כך שתוכל לערבב $1 ו $<name> באותו תחליף אם תרצו. when you are first assemblying a pattern and are not yet sure which groups you need, the בונה רגקס עוזר לך לבנות אותו חלק אחר חלק לפני שאתה מביא אותו לכאן כדי להפעיל את ההחלפה.
מה המשמעות של אסימוני ההחלפה המיוחדים?
סימן הדולר מיוחד בתוך מחרוזת חלופית, והוא מציג סט קטן של אסימונים מעבר לקבוצות הממוספרות והנקובות בשמות. ידיעתם חוסכת מכם להגיע לדפוס מסובך יותר ממה שאתם צריכים.
$& מוסיף את כל מחרוזת המשנה המותאמת. זה מה שאתה רוצה כשאתה עוטף או מעיר התאמות במקום לבנות אותן מחדש - דפוס של \b\w+@\w+\.\w+\b עם תחליף של <$&> שם סוגריים זווית סביב כל כתובת אימייל מבלי שתצטרך ללכוד את כל העניין בקבוצה. $\`` (a backtick) inserts everything *before* the match, and $'(an apostrophe) inserts everything *after* it; these are rarely needed but occasionally exactly right. And because$is special, outputting a literal dollar sign requires doubling it:$$in the replacement produces a single$` בתפוקה, מה שחשוב ביום שבו אתה מעצב מחדש מטבע.
יש ניב מחיקה אחד ששווה להתחייב לזיכרון: החלפה ריקה מסירה כל התאמה עם הדגל הגלובלי מופעל והשדה החלף נותר ריק, הכלי מוחק כל מופע של התבנית מהטקסט. זו הדרך הנקייה ביותר להפשיט משהו - כל תגי HTML עם <[^>]+>, כל חלל נגרר עם +$ במצב multiline, כל הלא ספרות ממספר טלפון עם \D. אינך מחליף ברווח או במציין מיקום; אתה מחליף בכלום, וההתאמה פשוט נעלמת.
אילו דגלים חשובים להחלפה?
הדגלים על רגקס משנים את אופן היישום שלו, ושניים מהם שולטים בעבודת ההחלפה היומיומית. השאר מצביים אך מדי פעם מכריעים.
הדגל העולמי, g, הוא זה שתחליף הכי הרבה. בלעדיו, JavaScript's replace משנה רק את ראשון התאמה ומשאיר את שאר הטקסט לבד - זה סטנדרטי String.replace התנהגות והפתעות אנשים שמצפים להחלפה הכל. לפנות g על וכל התאמה בטקסט נכתבת מחדש הכלי כברירת מחדל לגלובלי על, כי החלפת הכל היא מה שאנשים מתכוונים תשע עשרה פעמים מתוך עשרים, אבל ההחלפה קיימת לזמנים שאתה באמת רוצה לגעת רק בהתרחשות הראשונה דגל ההתעלמות-מקרה, i, גורם לדפוס להתאים ללא קשר לאותיות, אז error גם גפרורים Error ו ERROR - חיוני כאשר אתה מנרמל את רמות היומן או מסדר היוון לא עקבי.
הדגל הרב-קו, m, משנה את מה שהעוגנים ^ ו $ ממוצע: עם זה דולק, הם תואמים את ההתחלה והסוף של כל אחד מהם קו במקום של הטקסט כולו, וזה מה שאתה רוצה כשאתה מפשיט רווח לבן נגרר או מקדים כל שורה. דגל dotAll, s, מאפשר לנקודה להתאים תווים בשורה חדשה, כך שתבנית יכולה להשתרע על מעברי שורות - שימושי לשכתוב בלוקים מרובי שורות. ה u (unicode) ו y דגלים (דביקים) מיועדים למקרים מתקדמים: u מאפשר טיפול נכון בתווים מחוץ למישור הבסיסי וצורות בריחה מסוימות, וכן y מעגן כל ניסיון התאמה למיקום המדויק אחרי הקודם טבלת ההשוואה שלהלן מסכמת מתי כל אחד זוכה במקומו.
| דגל | מכתב | השפעה על תחליף | שימוש אופייני |
|---|---|---|---|
| גלובל | g |
החלף כל התאמה במקום רק את הראשונה | כמעט כל תחליף-כל |
| התעלם ממקרה | i |
התאמה ללא קשר למקרה המכתב | נרמול רמות יומן, סידור אותיות רישיות |
| רב קו | m |
^ ו $ עוגן לכל קו |
קידומת קווים, הפשטת רווחים נגררים |
| DotAll | s |
הנקודה תואמת גם קווים חדשים | שכתוב בלוקים מרובי שורות |
| יוניקוד | u |
טיפול נכון בדמויות אסטרליות ו \u{...} |
אמוג'י, תסריטים לא לטיניים |
| דביק | y |
התאמה רק במיקום הנוכחי | אסימונים, ניתוח רציף קפדני |
מתי עלי להשתמש ב-regex replace במקום ב-find-and-replace רגיל?
קו ההפרדה הוא פשוט: השתמש ב-find-and-replace רגיל כאשר אתה יודע את הטקסט המדויק, והושיט יד ל-regex החלף כאשר אתה יודע את הצורה אך לא את הטקסט המדויק. אם אתה משנה כל 2023 ל 2024, החלפה רגילה היא מהירה ובטוחה יותר אם אתה משנה כל שנה בת ארבע ספרות ללא קשר לערך, רק דפוס יכול לבטא זאת.
שלוש משפחות של משימה נופלות בבירור בצד הרגקסי. הראשון הוא עיצוב מחדש, כאשר התוכן נשאר זהה אך הסידור שלו משתנה - תאריכים, מספרי טלפון, שמות שנכתבו "Last, First" שאתה רוצה בתור "First Last." לכידת קבוצות בתוספת ידית החלפה מסודרת מחדש כל אלה. השני הוא הפשטה בתפזורת, שבו אתה מוחק כל מה שמתאים לתבנית - תגיות, הערות, תווי בקרה, רווח לבן נוסף - על ידי החלפה בכלום. השלישי הוא עריכה מותנית בקנה מידה, שבו אתה עוטף, קידומת או מציין כל מופע של דפוס, באמצעות $& כדי לשמור על ההתאמה ולהוסיף לה. כאשר הטרנספורמציה שאתה מתאר לעצמך מכילה את המילה "every" ואחריו תיאור ולא מחרוזת מילולית, אתה נמצא בטריטוריה להחלפת regex.
יש גם ארגומנט זרימת עבודה ביצוע עריכות אלה בעורך הקוד שלך & #39;s למצוא ולהחליף עובד, אבל זה עורך את הקובץ במקום, מה שאומר טעות היא טעות בקובץ האמיתי שלך הפעלת הטרנספורמציה בכלי שריטה תחילה מאפשר לך לראות את הפלט ואת ספירת ההחלפה לפני שאתה מבצע משהו, ולאחר מכן להדביק את התוצאה המאומתת בחזרה. כי החלפת Regex הכלי פועל כולו בדפדפן שלך ולעולם לא מעלה את מה שאתה מדביק, זה בטוח לשימוש גם כאשר הטקסט הוא יומן ייצור או ייצוא לקוח - נקודה שאני מעלה במלואה ב- מדריך פרטיות נתונים לכלים מקוונים.
מהן הטעויות הנפוצות עם החלפת regex?
השכיח שבהם הוא לשכוח את הדגל העולמי ולתהות מדוע רק ההתאמה הראשונה השתנתה אם נראה שהמחליף שלך לא עשה כמעט כלום - עריכה אחת שבה ציפית לעשרות - בדוק זאת g הוא על זה הוא טיול כל כך נפוץ כי הכלי כברירת מחדל זה כדי להפעיל, אבל ברגע שאתה לכבות אותו כדי למקד התאמה בודדת, זכור להפוך אותו בחזרה.
השני הוא מילולי $1 מופיע בפלט שבו ציפית לטקסט שנלכד. זה כמעט תמיד אומר שהקבוצה שאליה אתה מפנה לא קיימת - לדפוס שלך אין קבוצה ראשונה של סוגריים, אז אין בשביל זה כלום $1 לעמוד בתור, והמנוע משאיר את האסימון כפי שהוא. התיקון הוא לעטוף את החלק שבו ברצונך לעשות שימוש חוזר בסוגריים כדי ליצור את הקבוצה, ולספור קבוצות משמאל החל מאחת. מלכודת קשורה היא ספירה שגויה כאשר הדפוס שלך קינן או קבוצות אופציונליות; כאשר המספור מבלבל, עבור לקבוצות עם שם כך שההפניה תהיה חד משמעית.
הטעות השלישית היא דפוס שמתאים יותר ממה שהתכוונת, בדרך כלל בגלל שמכמת הוא חמדן דפוס כמו <.+> נועד להתאים תג HTML אחד יתאים בשמחה מהראשון < לthe אחרון > על הקו, בולעת הכל בין שני תגים התרופה היא מכמת לא חמדן, <.+?>, או מחלקת תווים מדויקת יותר, <[^>]+>. זה בדיוק המצב שבו אתה מאמת את הדפוס ב- בודק רגקס ראשית, צפו במה שהוא מדגיש, ורק אז הפעילו את ההחלפה - הרגל מדריך regex-tester עובר בפירוט ספירת ההחלפה המוצגת בכלי היא ההגנה האחרת שלך: אם הוא מדווח על הרבה יותר או הרבה פחות החלפות ממספר הדברים שהתכוונת לשנות, הדפוס שגוי, לא הכלי.
דוגמה מעובדת: עיצוב מחדש של שמות והפשטת רעש
תן לי לעבור עבודה קטנה מקצה לקצה, כי לראות את החלקים עובדים יחד מתקן את הרעיון טוב יותר מכל כלל בודד נניח שיש לך רשימה של אנשי קשר מיוצאים כ Doe, Jane ו Smith, John, אחד לכל שורה, ואתה רוצה אותם בתור Jane Doe ו John Smith.
הצורה של כל שורה היא: כמה תווי מילים, פסיק, רווח, ואז עוד תווי מילים. כתבנית כלומר (\w+), (\w+), כאשר שם המשפחה נלכד בקבוצה אחת והשם הפרטי בקבוצה שתיים. ההחלפה שמחליפה אותם ומפילה את הפסיק היא $2 $1 - קבוצה שתיים, רווח, קבוצה אחת הדבק את הרשימה לתוך החלפת Regex כלי, הזן את הדפוס וההחלפה, השאר את הדגל הגלובלי דולק, וכל שורה מתהפכת אל "First Last" בבת אחת. ספירת ההחלפות אומרת לך בכמה שורות נגעו, מה שאתה יכול לבדוק את השפיות מול מספר אנשי הקשר.
עכשיו תגיד לאותו ייצוא יש רווח לבן נגרר בכמה קווים שגם אתה רוצה שיעלם. זהו תחליף שני, נפרד: דפוס +$ עם הדגל הרב-קו על כך $ תואם את סוף כל שורה, והחלפה ריקה כך שהרווחים התואמים יימחקו ולא יוחלפו. הפעל אותו לאחר החלפת השם והקובץ נקי. גישת שני המעברים - החלפה אחת למבנה מחדש, אחת לרצועה - אופיינית, ומכיוון שכל מעבר מראה לך את הפלט והספירה שלו לפני שאתה מעתיק אותו, אתה אף פעם לא מנחש אם הטרנספורמציה עשתה את מה שהתכוונת. כאשר הטקסט המעוצב מחדש זקוק להפרש חזותי סופי מול המקור כדי לאשר ששום דבר אחר לא זז, הדבק את שתי הגרסאות ב- הבדל טקסט כְּלִי. עבור הערכה הרחבה יותר של כלי עזר יומיומיים זה מתאים, ה ערכת כלים למפתחי אינטרנט אוסף את אלה שאני מגיע אליהם הכי הרבה.
שאלות נפוצות
איך אני מוצא ומחליף בביטוי רגולרי באינטרנט? הזן את התבנית שלך בשדה מצא ללא חתכים, כתוב את ההחלפה בשדה החלף, בחר את הדגלים שלך והדבק את הטקסט שלך הפלט המשוכתב מופיע באופן מיידי ומראה כמה החלפות רצו הכל קורה בדפדפן שלך, כך ששום דבר לא מועלה.
כיצד פועלות הפניות קבוצתיות לכידת בהחלפה?
סוגריים בתבנית שלך יוצרים קבוצות ממוספרות, ואתה עושה בהן שימוש חוזר בהחלפה ב-$1, $2 וכן הלאה. לדוגמה, התבנית (\d{4})-(\d{2})-(\d{2}) עם ההחלפה $3/$2/$1 הופכת את 2024-01-15 ל-15/01/2024. קבוצות בשם כמו (?
איך אני מחליף את כל ההתאמות במקום רק את הראשון? אפשר את הדגל g (גלובלי) בלעדיו, JavaScript מחליף רק את ההתאמה הראשונה, בדיוק כפי שמתנהגת שיטת String.replace.עם g מופעל, כל התאמה בטקסט מוחלפת, וזה מה שרוב המשימות החלופיות-כל צריכות.
איך אני מוחק כל התאמה במקום להחליף אותה? השאר את השדה החלף ריק עם הדגל הגלובלי מופעל, כל התאמה מוסרת מהטקסט זוהי הדרך הנקייה ביותר להפשיט תגים, ריצות רווח לבן או תווים לא רצויים החולקים תבנית.
מה המשמעות של האסימונים המיוחדים $&, backtick ואפוסתרוף בהחלפה? $& מכניס את כל תת המחרוזת המותאמת, backtick מכניס את הטקסט לפני ההתאמה, ו apostrophe מכניס את הטקסט אחריו.כדי להוציא סימן דולר מילולי, כתוב $$. אלה עוקבים אחר דפוסי החלפה מיוחדים של JavaScript String.replace הסטנדרטיים.
באיזה טעם regex משתמש הכלי הזה? הוא משתמש במנוע ה-RegExp של JavaScript (ECMAScript) המובנה בדפדפן שלך, וזהה לזה שב-Node.js. התוצאות כאן תואמות לאופן שבו אותו דפוס והחלפה מתנהגים ב-JavaScript וב-TypeScript. JavaScript regex שונה מ-PCRE, Python re ו-Java בכמה תכונות מתקדמות.
מדוע המחליף שלי מייצר $1 מילולי במקום הטקסט שנלכד? 1 $ מילולי בפלט בדרך כלל אומר הדפוס שלך אין קבוצת לכידה ראשונה, אז אין שום דבר עבור $1 כדי להתייחס לעטוף את החלק שאתה רוצה לעשות שימוש חוזר בסוגריים כדי ליצור את הקבוצה, ולספור קבוצות משמאל לימין החל מ 1.
האם זה בטוח להפעיל החלפת regex על נתונים רגישים? כן כל ההתאמה וההחלפה מתרחשות ב-JavaScript בתוך הדפדפן שלך, כך ששום דפוס, החלפה או טקסט לא נשלחים לשום שרת, שום דבר לא נרשם, והכלי עובד כשהחיבור שלך מושבת. אתה יכול לעצב מחדש בבטחה קבצי יומן, נתונים אישיים או פורמטים קנייניים.
מדריך זה מלווה את החינם החלפת Regex כלי על Toolz.dev - אין הרשמה, אין העלאות, עובד במצב לא מקוון.



