2011-12-25 101 views
2

我想知道,在一個大的字符串與另一個我怎麼能代替一個字符,只有在匹配{}正則表達式替換隻有在{}

這之間:

bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok 

要這樣:

BLA BLA BLA%{OK文本^^什麼} {有些%的}%文本{是^^不正確} OK

注意{%more}沒有更改,因爲字符和字母之間有空格。

非常感謝。

+4

如果有什麼大括號嵌套? – SLaks 2011-12-25 00:25:24

+0

嘗試使用regexbuddy軟件。 – 2011-12-25 01:14:41

回答

3

如果{}沒有嵌套沒有}可能會發生這些之外,你可以做這樣的事情:

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)}[^{}]*+)*+),這是遞歸檢查任意嵌套{}被替換。

Example

$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 } 
+0

這個答案不那麼複雜,效果更好。大量使用Lookahead。 – 2011-12-25 01:25:11

+0

很好奇使用:'[^ {]'爲什麼有必要? – 2011-12-25 01:41:38

+0

@Tobi,我正在做的只是檢查在當前'%\ w'後面有一個'}'而沒有任何開放的'{',因此我們在'{}'裏面。 – Qtax 2011-12-25 01:50:00

4
$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 
+2

只適用於每個「{}」有一個'%foo'。 – Qtax 2011-12-25 01:09:22