שאלה ב-regex ב-js
-
var s = "Ahron" var r = /^(Ahr)(o?)([^n])/
מחזיר
Full match 0-4 `Ahro` Group 1. n/a `Ahr` Group 2. n/a `` Group 3. n/a `o`
כלומר, בשביל שלא להחזיר null, ה-regex מימש את האפשרות "לא למצוא" את O בתיבה 2 ושם אותו בתיבה 3 בו כתוב "כל תו שאינו n".
יש לי עם זה 2 בעית
- במידה ואני רוצה להחליף את O, אני לא יודע באיזה תיבה הוא נמצא.
- הצפיה שלי היא שבמקרה כזה ש-O נמצא, הוא ימומש, ואז בגלל ^n כל החיפוש יכשל ויחזיר null.
אז הפתרון הוא להכניס את O שוב לשלילה, כך:
var r = /^(Ahr)(o?)([^on])/
משום מה, זה נראה לי פתרון עקום (אולי אני טועה)
דבר שני אם יש רצף ארוך יותר של תווים אופציונאליים (כמו O בדוגמא לעיל) זה ממש מלכלך את הקוד.
האם יש פתרון אלגנטי יותר, לומר לו "אל תממש את האפשרות 'לא למצוא' במידה והתו קיים".מקווה מאוד שאני ברור מספיק
זה שיגע אותי יממות (ללא הגזמה!)
תודה מראש!פורסם במקור בפורום CODE613 ב18/02/2017 22:31 (+02:00)
-
דוד היקר אמר לי שהתשובה נמצאת באפשרות grupe names.
אבל לא זכיתי להבין
ככל שאני מבין, זה מאפשר לשמור תווית בשם, בשביל להשתמש בו פעמים נוספות. איך זה עוזר כאן?
בנוסף כשסימנתי בטבלה הזו JavaScript, כל העמודה מסומנת כ-no או n/o. הכוונה שאין לזה תמיכה ב-JS?פורסם במקור בפורום CODE613 ב18/02/2017 22:42 (+02:00)
-
אני טעיתי, אין את היכולת הזו בRegex של JS.
זה היה עוזר כי היית נותן שם לקבוצה של o, והיית פונה אליו.
אבל למשעה אינני מבין את הבעיה:var texts = ["Ahron", "Ahroe", "Ahree"]; var reg = /^(Ahr)(o?)([^on])/; for (let text of texts) { console.log(text.match(reg)); }
הפלט הוא:
null
["Ahroe", "Ahr", "o", "e"]
["Ahre", "Ahr", "", "e"]אז תמיד $2 זה מקום ה-o האופציונלי, לא כן?
פורסם במקור בפורום CODE613 ב18/02/2017 23:27 (+02:00)