לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 27-06-2008, 14:42
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
(PCRE) ביטוי רגולרי רקורסיבי למציאת לוכסנים אחוריים

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

כתבתי את זה:

קוד:
([\\\])*\\1


כאשר הדגלים שלי הם:
קוד:
imU


הביטוי הנ"ל הוא רק חלק מביטוי גדול יותר, וה-back reference שהוא \\1 מתייחס ל-subpattern שאתם רואים לפניכם.
בינתיים, עד כמה שבדקתי, הביטוי עובד טוב כאשר יש לוכסנים. אבל כשאין לוכסנים זה פשוט מחזיר שהביטוי לא נמצא כלל (כאשר זה אמור למצוא את הביטוי, אפילו אם במחרוזת שבה מחפשים אין כלל לוכסנים אחוריים בכפולות של 2.)
למרות שניסיתי להיעזר באופרטור ? כדי שלמקרה שזה לא ימצא לוכסנים זה עדיין יחזיר פסוק אמת, זה לא מצליח.

לדוגמא, אני רוצה שזה ימצא:
קוד:
2 לוכסנים אחוריים: \\ או 4 לוכסנים אחוריים: \\\\ או 6 לוכסנים אחוריים: \\\\\\

וכן הלאה, בכפולות של 2.
אבל אם אין לוכסנים - אז שכביכול הביטוי של מציאת הלוכסנים מבוטל כלא היה.

אני מניח שחלק גדול מהבעיה הוא דגל ה-Ungreedy, שאותו אני חייב להשאיר.

בנוסף, ניסיתי להיעזר ב-Recursive patterns (מוצגים בעמוד הבא למטה: http://www.php.net/manual/en/regexp.reference.php ) אבל כנראה זה לא נתמך בגירסת ה-PCRE שלי, או שזה נתמך אבל לא עובד (כפי שגיליתי שקרה למישהו אחר שניסה את ה-Recursive patterns).

יש למישהו רעיון?

תודה רבה!
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 28-06-2008, 20:25
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
הבעיה נפתרה
בתגובה להודעה מספר 1 שנכתבה על ידי DCD שמתחילה ב "(PCRE) ביטוי רגולרי רקורסיבי למציאת לוכסנים אחוריים"

# ואדים:
תודה ואדים על הצעתך להוריד את הדגל U - זה בסופו של דבר היה צעד חיוני לפיתרון הבעיה...

ציטוט:
אתה לא יכול לשים U מאחר וזה יתאים את הסטרינג הקטן/קצר ביותר באקספרשיין (זאת אומרת ימצא רק את האלכסונים הכפולים הראשונים).

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

# נתנאל:
רציתי ביטוי שימצא לי אם יש חזרות צמודות (בלי שום תו המפריד בין החזרות) של פעמיים סלש אחורי (כלומר \\) ; או שזה לא ימצא כלל חזרות, אבל עדיין יחזיר פסוק אמת (דבר שהצלחתי להשיג בעזרת האופרטור * ).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 28-06-2008, 23:09
  DCD DCD אינו מחובר  
 
חבר מתאריך: 17.05.05
הודעות: 7,321
בתגובה להודעה מספר 5 שנכתבה על ידי vadim88 שמתחילה ב "אז אני מניח שהבעיה נפתרה רק..."

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

מעט אחרי הזמן שכתבתי את ההודעה שכביכול הבעיה נפתרה, עשיתי בדיקות נוספות וגיליתי שהביטוי הכללי ממש לא טוב.
אחרי הרבה זמן, למזלי, קראתי בעמוד של "Pattern Modifiers" את החלק הבא בדגל ה-U:
ציטוט:
It can also be set by a (?U) modifier setting within the pattern or by a question mark behind a quantifier (e.g. .*?).

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

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

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 01:04

הדף נוצר ב 0.05 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר