לפני שנתייחס לסוגריים בתוך סוגריים, נכתוב כאן קודם כל איך מוצאים את כל הסוגריים במסמך על מנת להחיל עליהם סגנון שונה. (אני למשל אוהב לתת לסוגריים סגנון תו שהעיצוב היחיד שלו הוא הקטנה של רוחב וגובה האות ל-70%. זה מתאים בעיקר בספרים שבהם הסוגריים אינם חלק ישיר מהטקסט, אלא מראי מקומות והערות במאמר מוסגר).
אמנם רבים כבר יודעים את זה, אך מכיוון שזו שאלה שאני נשאל שוב ושוב, מסתבר שיש גם רבים שלא יודעים.
אפשר למצוא סוגריים באמצעות חיפוש GREP פשוט (או סגנון GREP אם רוצים)

כדי להבין את החיפוש נפרק את המחרוזת (שבתמונה היא משמאל לימין)
\( – הלוכסן למעשה אומר לאינדיזיין להתייחס לסימן פתיחת הסוגריים שבא בעקבותיו כפי שהוא באמת – פתיחת סוגריים. (ללא הלוכסן, אינדיזיין תחשוב שמדובר בקוד של הGREP שמגדיר קבוצה)
. – הנקודה מייצגת תו כלשהו
+ – סימן הפלוס בא לומר שיחפש את התו הקודם עוד פעמים (זאת אומרת שאם התו הקודם הוא “תו כלשהו”, הפלוס הופך את זה ל"תווים כלשהם")
? – סימן השאלה בא לצמצם את החיפוש למופע הקטן ביותר. אם לא נוסיף אותו אינדיזיין תמצא החל מהסוגריים ועד לסוגריים האחרונות שבפיסקה, גם אם יש בתווך עוד סגירת סוגריים.
\) – סגירת סוגריים.
עד כאן הכל נהדר. אך מה קורה אם יש לנו סוגריים בתוך סוגריים?

סימן השאלה שתפקידו לצמצם את המחרוזת, גורם לאינדיזיין למצוא תוצאה משובשת, אך גם בלעדי הסימן שאלה אי-אפשר, מכיוון שכאמור, הטקסט שיימצא הוא עד סוף הפיסקה (אמנם במקרה שהדגמתי זה בסדר, אך אם היה טקסט ממשיך אחרי הסוגריים האחרונים זה לא היה עוזר). אז מה עושים?
הפתרון הוא להשתמש בקוד גרפ המבטא רקורסיה. מכיון שאיננו עוסקים כאן בתכנות לא נרחיב על כך, רק נביא את ההגדרה מויקיפדיה לרקורסיה:
רקורסיה – תופעה שכל מופע שלה מכיל מופע נוסף שלה, כך שהיא מתרחשת ומשתקפת בשלמותה בתוך עצמה שוב ושוב.
ושם בהמשך:
אלגוריתם רקורסיבי הוא אלגוריתם אשר על מנת לפתור בעיה מסוימת, מפעיל את עצמו על מקרים פשוטים יותר של הבעיה (ובמקרים רבים: על תתי בעיות). בדרך כלל יכלול האלגוריתם תנאי עצירה, שיביא להפסקת הרקורסיה ברמה שבה הפתרון נתון מראש, שאם לא כן תהיה זו לולאה אינסופית רקורסיבית.
כמו בכל דבר שקשור ל-GREP, גם כאן יש מספר דרכים להגיע לתוצאה הרצויה, אך אני בוחר לשים כאן את הביטוי שכתב יהודה נויפלד (הקוד נכתב משמאל לימין): \(((?>[^()]+)|(?R))*\)





