עבור לתוכן

עזרה עם regex

Featured Replies

פורסם

היי,

אני מעוניין לבנות ביטוי regex שיוכל לזהות סוגריים חיצוניים.

הכוונה, בהינתם הביטוי הבא:

5 + ( 2 + 3 + ( 5 - 2 ) + 3 ) + (2 - 5)

אני רוצה שהוא יוכל להביא לי את

( 2 + 3 + ( 5 - 2 ) + 3 )
(2 - 5)

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

זה אפשרי? למישהו יש רעיון?

זה צריך להיות דרך אגב regex בגאווה.

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

פורסם

תיאורטית, אי אפשר לעשות את זה עם regex (בכלליות, regex לא יכול "לספור" ללא הגבלה, כלומר אפשר לספור איתו רק אם אתה יודע מראש שמה שאתה סופר מוגבל מראש לכמות מסויימת).

לומדים את זה בערך בשיעור שלישי של הקורס "מודלים חישוביים" :)

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

פורסם
  • מחבר

תיאורטית, אי אפשר לעשות את זה עם regex (בכלליות, regex לא יכול "לספור" ללא הגבלה, כלומר אפשר לספור איתו רק אם אתה יודע מראש שמה שאתה סופר מוגבל מראש לכמות מסויימת).

לומדים את זה בערך בשיעור שלישי של הקורס "מודלים חישוביים" :)

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

תודה!

לא מומלץ, לא יפה ויורידו לי על זה נקודות :)

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

מודלים חישוביים אין לי (לפחות בינתיים).

פורסם

אני אנסה לנצל את האשכול הזה למען מטרה מאוד דומה.

איך ניתן לתפוס את הסוגריים הכי פנימיים?

כלומר אלו שאינם מכילים סוגריים בתוך עצמם..

לדוגמה עבור (1 + (3 + 5) - 2)

את (3 + 5) ?

פורסם

את זה דווקא אפשר לעשות בביטוי רגולרי מאוד פשוט:

\([^\(\)]*\)

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

פורסם

תודה!

אם תרשה לי להציע תיקון קל, למען שימור הידע.. :) צריך 2 \\ כי \ אחד מתייחס כ \ של ג'אווה ולא של REGEX.

פורסם

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

ב-#C לדוגמה אפשר לעשות ככה:

@"\([^\(\)]*\)"

פורסם

אני עדיין ב Java, אבל אני אזכור זאת לקראת הקיץ - כשאעשה C :jump:

תודה ושבת שלום

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים