REGEXP_REPLACE, השארת חלק מהערך
-
האם REGEXP_REPLACE (שבשימוש mysql) תומך באפשרות של החלפת חלק מהמחרוזת שמעובדת ברג'קס?
לדוגמא אם יש לי טקסט כזה:[mention]987[/mention]ואני רוצה לסנן את הmention ולהשאיר את ה987.
נתמך?
@chagold בהחלט.
נסה ככהSELECT REGEXP_REPLACE(`columnWithBBcode`, "\[([^]]+)\]([^[]+)\[\/\1\]", "\2") FROM `TABLE`בדיקת הרג'קס: https://regex101.com/r/GmBaov/1
אם זה עובד טוב והתוצאות משביעות רצון, שנה את המשפט לUPDATE:
UPDATE `TABLE` SET `columnWithBBcode` = REGEXP_REPLACE(`columnWithBBcode`, "\[([^]]+)\]([^[]+)\[\/\1\]", "\2") WHERE ? -
@chagold בהחלט.
נסה ככהSELECT REGEXP_REPLACE(`columnWithBBcode`, "\[([^]]+)\]([^[]+)\[\/\1\]", "\2") FROM `TABLE`בדיקת הרג'קס: https://regex101.com/r/GmBaov/1
אם זה עובד טוב והתוצאות משביעות רצון, שנה את המשפט לUPDATE:
UPDATE `TABLE` SET `columnWithBBcode` = REGEXP_REPLACE(`columnWithBBcode`, "\[([^]]+)\]([^[]+)\[\/\1\]", "\2") WHERE ? -
@yossiz אמר בREGEXP_REPLACE, השארת חלק מהערך:
@dovid זה עבד לך?
הבעיה הנ"ל נפתרת על ידי מילוט ככה:
SELECT REGEXP_REPLACE('[mention]987[/mention]', "\\[([^]]+)\\]([^\\[]+)\\[\/\1\\]", "\2")אבל זה לא עושה מה את המבוקש (כי mysql לא תומך ב-back references לא בחיפוש ולא בהחלפה)
התוצאה:+----------------------------------------------------------------------------+ | REGEXP_REPLACE('[mention]987[/mention]', "[([^]]+)]([^\\[]+)[\/\1]", "\2") | +----------------------------------------------------------------------------+ | [mention]987[/mention] | +----------------------------------------------------------------------------+ 1 row in set (0.01 sec)עריכה: יש באג מעצבן בפורום שהוא מסתיר לפעמים תווי backslash בקוד

הקוד של דוד עובד ב-mariadb כי הוסיפו שם אפשרות ל-back references
זה צריך להיות כתוב ככה (אבל הפורום הורס את המילוט
) :SELECT REGEXP_REPLACE('[mention]987[/mention]', "^\\[([^]]+)\\]([^[]+)\\[\\/\\1\\]", "\\2");נותן תוצאה של
987הנה fiddle:
https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=4c1225e23b4bd808022ed4351b77ef1d -
@yossiz אמר בREGEXP_REPLACE, השארת חלק מהערך:
@dovid זה עבד לך?
הבעיה הנ"ל נפתרת על ידי מילוט ככה:
SELECT REGEXP_REPLACE('[mention]987[/mention]', "\\[([^]]+)\\]([^\\[]+)\\[\/\1\\]", "\2")אבל זה לא עושה מה את המבוקש (כי mysql לא תומך ב-back references לא בחיפוש ולא בהחלפה)
התוצאה:+----------------------------------------------------------------------------+ | REGEXP_REPLACE('[mention]987[/mention]', "[([^]]+)]([^\\[]+)[\/\1]", "\2") | +----------------------------------------------------------------------------+ | [mention]987[/mention] | +----------------------------------------------------------------------------+ 1 row in set (0.01 sec)עריכה: יש באג מעצבן בפורום שהוא מסתיר לפעמים תווי backslash בקוד

הקוד של דוד עובד ב-mariadb כי הוסיפו שם אפשרות ל-back references
זה צריך להיות כתוב ככה (אבל הפורום הורס את המילוט
) :SELECT REGEXP_REPLACE('[mention]987[/mention]', "^\\[([^]]+)\\]([^[]+)\\[\\/\\1\\]", "\\2");נותן תוצאה של
987הנה fiddle:
https://dbfiddle.uk/?rdbms=mariadb_10.6&fiddle=4c1225e23b4bd808022ed4351b77ef1d -
@yossiz אין לי שום mysql שאוכל לבדוק.
חיפשתי באינטרנט על תמיכת regex בmariadb וראיתי שזה מבוסס PCRE ועל פי זה כתבתי. -
C chagold התייחס לנושא זה ב
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות
