我想知道,在一個大的字符串與另一個我怎麼能代替一個字符,只有在匹配{}正則表達式替換隻有在{}
這之間:
bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok
要這樣:
BLA BLA BLA%{OK文本^^什麼} {有些%的}%文本{是^^不正確} OK
注意{%more}沒有更改,因爲字符和字母之間有空格。
非常感謝。
我想知道,在一個大的字符串與另一個我怎麼能代替一個字符,只有在匹配{}正則表達式替換隻有在{}
這之間:
bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok
要這樣:
BLA BLA BLA%{OK文本^^什麼} {有些%的}%文本{是^^不正確} OK
注意{%more}沒有更改,因爲字符和字母之間有空格。
非常感謝。
如果{}
是沒有嵌套沒有}
可能會發生這些之外,你可以做這樣的事情:
preg_replace('/%(?=\w[^{]*})/', '^^', $string);
當字符串是:
bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok { %foo %bar %baz }
你會得到:
la % bla {ok text ^^nothing} some {% more} % text {yes ^^no ok} ok { ^^foo ^^bar ^^baz }
如果嵌套{}
是允許的,你可以使用:
%(?=\w([^{}]*+(?:{(?1)}[^{}]*+)*+)})
與第一個其中一期工程,與[^{]*
由([^{}]*+(?:{(?1)}[^{}]*+)*+)
,這是遞歸檢查任意嵌套{}
被替換。
$string = '%a { %a { %a } %a { { %a } %a } } %a { % %a } %a { %a }';
echo preg_replace('/%(?=\w([^{}]*+(?:{(?1)}[^{}]*+)*+)})/', '^^', $string);
輸出:
%a { ^^a { ^^a } ^^a { { ^^a } ^^a } } %a { % ^^a } %a { ^^a }
這個答案不那麼複雜,效果更好。大量使用Lookahead。 – 2011-12-25 01:25:11
很好奇使用:'[^ {]'爲什麼有必要? – 2011-12-25 01:41:38
@Tobi,我正在做的只是檢查在當前'%\ w'後面有一個'}'而沒有任何開放的'{',因此我們在'{}'裏面。 – Qtax 2011-12-25 01:50:00
$str = 'bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok';
$str = preg_replace('/(\{[^}]*)%(\w[^}]*)/', '$1^^$2', $str);
// bla bla % bla {ok text ^^nothing} some {% more} % text {yes ^^no ok} ok
只適用於每個「{}」有一個'%foo'。 – Qtax 2011-12-25 01:09:22
如果有什麼大括號嵌套? – SLaks 2011-12-25 00:25:24
嘗試使用regexbuddy軟件。 – 2011-12-25 01:14:41