2011-05-17 165 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