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 התייחס לנושא זה ב
