2011-05-17 163 views
2

我收到正則表達式的堅果。我有一個這樣的字符串:從正則表達式的字符串獲取變量

%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%) 

我需要的是符合以下正則表達式:

%closed% 
%closed_percent% 
%open% 
%open_percent% 

而不是兩個\%

目前我使用:

\%([^\%]+)\% 

,讓我:

%closed% 
%closed_percent% 
%), % 
% open (% 
... 

任何人都可以幫助我嗎?

回答

2

硅mple方式:

%\w+% 

匹配:%foo%

允許(多個)反斜槓:

(?<!\\)(?:\\.)*%(\w+)% 

只匹配bar在:\%foo% \\%bar% \\\%baz%

...這使得它的內部逃逸太:

(?<!\\)(?:\\.)*%((?:[^\\%\s]+|\\.)+)% 

匹配:%foo\%bar%

使用第一個捕獲組的值與最後兩個表達式。

+1

好的技巧。我必須將'[^ \%\ s]'改爲'[^ \\%\ s]'才能使它正常工作 - 你需要一個反斜槓,大多數風格都會看到'\%'並忽略反斜槓,就像如果你寫了'%'。順便說一句,爲什麼每個人都逃避現在的跡象?這是否意味着任何味道? – Kobi 2011-05-17 16:37:22

+0

@Kobi,在Perl中它是一個散列變量的標誌,我猜可以插入它。你有像'%+%-'這樣的哈希。 '@'也一樣。 – Qtax 2011-05-17 20:28:28

0

嘗試:

~\%\w+\%~ 

所以,只允許A-Z A-Z和_在您的選擇。

​​

$matches現在包含:

Array 
(
    [0] => Array 
    (
     [0] => %closed% 
     [1] => %closed_percent% 
     [2] => %open% 
     [3] => %open_percent% 
    ) 
) 
1

試試這個:

\%([^(\\\%)]+?)\% 

比賽

%closed% 
%closed_percent% 
%open% 
%open_percent% 

我。

0

爲反斜槓添加負向後視圖!正如預期的那樣,\%被忽略。

(?<!\\)\%([^\%]+)(?<!\\)\% 

匹配

%收盤%

%closed_percent%

%打開%

%open_percent%

1

假設什麼可以在百分之包裹令牌(包括轉義字符),並可以逃過什麼字(所以反斜槓也可以被轉義:\\%token%應該是有效的)沒有限制,
這裏是你可以使用一個模式跳過轉義字符:

\\.|(%([^%\\]|\\.)+%) 

這將捕獲的百分比包裹令牌,並且將捕捉它們在第一組($1)英寸轉義字符也將匹配(這是一個很好的把戲跳過它們),但使用PHP是很容易得到的只是相關的標記:

preg_match_all('/\\\\.|(%([^%\\\\]|\\\\.)+%)/', $str, $matches, PREG_PATTERN_ORDER); 
$matches = array_filter($matches[1]); 

工作例如:http://ideone.com/dziCB