1 回答

TA貢獻1871條經驗 獲得超13個贊
您應該使用積極的前瞻來匹配以確保匹配以該模式開頭,但您必須將整個括號匹配模式包裝在另一個捕獲組中并使用(?1)子例程而不是(?R)僅遞歸該模式,而不是整個正則表達式:
(?=\([a-z0-9_-]+:)(\((?:[^()]+|(?1))*+\))
^^^^^^^^^^^^^^^^^^^ ^^^^ ^
請參閱正則表達式演示。
細節
(?=\([a-z0-9_-]+:)- 一個正向前瞻,需要(1+ 小寫 ASCII 字母、數字、下劃線或連字符,:緊跟在當前位置的右側
(\((?:[^()]+|(?1))*+\))- 捕獲組 1(稍后將遞歸):
\(-(
(?:[^()]+|(?1))*+- 1+ 重復 1+ 除(和)或整個 Group 1 模式以外的任何字符(遞歸)
\)-)
如果您還想支持笑臉,您可以將它們的特定模式添加到正則表達式子例程所在的交替組中,作為第一種選擇:
(?=\([a-z0-9_-]+:)(\((?::[)(]|[^()]|(?1))*+\))
^^^^^
我在后面添加:[)(]匹配:)或:(刪除+,[^()]以便能夠逐個字符地檢查嵌套括號內的字符串。
隨意調整它以適應您的需求,或添加更多笑臉圖案。
使用正則表達式查看這個正則表達式演示(?=\([a-z0-9_-]+:)(\((?::(?:[()pPDd*oO]|'\()|<3|;\)|[^()]|(?1))*+\))。
- 1 回答
- 0 關注
- 146 瀏覽
添加回答
舉報