我正在嘗試用雙大括號內的字符替換-字符。_
示例輸入:
Hello {{first-name}}, how are you?
The event {{event-name-address}}
示例輸出:
Hello {{first_name}}, how are you?
The event {{event_name_address}}
這是我嘗試做的正則運算式:{{. (-). }},這是preg_replace我嘗試使用的 PHP 函式:$template = preg_replace("{{. (-). }}", "$1_", $template);
這似乎不起作用。
我究竟做錯了什么?謝謝!
uj5u.com熱心網友回復:
曲線括號應該被轉義,它們是正則運算式元符號。比,在 之前和之后使用兩組-:
(\{\{[^}] )-([^}] \}\})
并替換${1}_$2.
[^}]用于表示“任何符號,但不是}”。
UPD:感謝@CarySwoveland 幫助澄清。
uj5u.com熱心網友回復:
如果雙括號匹配且未嵌套,則可以替換匹配的
(?<=[^{])\-(?=[^{}] }})
和 '_'。這假定匹配的雙大括號對之間的連字符前面必須有一個除 之外的字符,'{'并且后面必須跟除 . 之外的字符'}'。1
請注意,這允許將多個連字符與同一對匹配的雙括號匹配。
這依賴于這樣的假設,即如果連字符后跟在既不是左大括號也不是右大括號的中間字符之后,是一對右雙大括號,該連字符前面必須有一對左雙大括號,中間字符是既不是開括號也不是閉括號。
演示
正則運算式可以分解如下:
(?<= # begin a positive lookbehind
[^{] # match a character other than '{'
) # end positive lookbehind
\- # match '-'
(?= # begin a positive lookahead
[^{}] # match one or more characters other than '{' and '}'
}} # match '}}'
) # end positive lookahead
1. 如果這不是要求,則運算式可以簡化為\-(?=[^{}]*}})。
uj5u.com熱心網友回復:
您可以使用
preg_replace('~(?:\G(?!^)|{{)[^{}-]*\K-(?=[^{}]*}})~', '_', $template)
請參閱正則運算式演示。詳情:
(?:\G(?!^)|{{)- 上一場比賽的結束或{{[^{}-]*{- 除,}和一個-char之外的零個或多個字符\K- 匹配重置運算子,它忽略從記憶體緩沖區中匹配的文本-- 一個連字符(?=[^{}]*}})- 緊跟零個或多個字符的位置,除了{and}和 then}}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475183.html
上一篇:使用UNICODE_CHARACTER_CLASS標志時的不同Java正則運算式匹配行為
下一篇:正則運算式匹配字串中的多個數字
