从正则表达式的字符串获取变量
问题描述:
我收到正则表达式的坚果。我有一个这样的字符串:从正则表达式的字符串获取变量
%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)
我需要的是符合以下正则表达式:
%closed%
%closed_percent%
%open%
%open_percent%
而不是两个\%
目前我使用:
\%([^\%]+)\%
,让我:
%closed%
%closed_percent%
%), %
% open (%
...
任何人都可以帮助我吗?
答
硅mple方式:
%\w+%
匹配:%foo%
允许(多个)反斜杠:
(?<!\\)(?:\\.)*%(\w+)%
只匹配bar
在:\%foo% \\%bar% \\\%baz%
...这使得它的内部逃逸太:
(?<!\\)(?:\\.)*%((?:[^\\%\s]+|\\.)+)%
匹配:%foo\%bar%
使用第一个捕获组的值与最后两个表达式。
答
尝试:
~\%\w+\%~
所以,只允许A-Z A-Z和_在您的选择。
$matches
现在包含:
Array
(
[0] => Array
(
[0] => %closed%
[1] => %closed_percent%
[2] => %open%
[3] => %open_percent%
)
)
答
试试这个:
\%([^(\\\%)]+?)\%
比赛
%closed%
%closed_percent%
%open%
%open_percent%
我。
答
为反斜杠添加负向后视图!正如预期的那样,\%
被忽略。
(?<!\\)\%([^\%]+)(?<!\\)\%
匹配
%收盘%
%closed_percent%
%打开%
%open_percent%
答
假设什么可以在百分之包裹令牌(包括转义字符),并可以逃过什么字(所以反斜杠也可以被转义:\\%token%
应该是有效的)没有限制,
这里是你可以使用一个模式跳过转义字符:
\\.|(%([^%\\]|\\.)+%)
这将捕获的百分比包裹令牌,并且将捕捉它们在第一组($1
)英寸转义字符也将匹配(这是一个很好的把戏跳过它们),但使用PHP是很容易得到的只是相关的标记:
preg_match_all('/\\\\.|(%([^%\\\\]|\\\\.)+%)/', $str, $matches, PREG_PATTERN_ORDER);
$matches = array_filter($matches[1]);
好的技巧。我必须将'[^ \%\ s]'改为'[^ \\%\ s]'才能使它正常工作 - 你需要一个反斜杠,大多数风格都会看到'\%'并忽略反斜杠,就像如果你写了'%'。顺便说一句,为什么每个人都逃避现在的迹象?这是否意味着任何味道? – Kobi 2011-05-17 16:37:22
@Kobi,在Perl中它是一个散列变量的标志,我猜可以插入它。你有像'%+%-'这样的哈希。 '@'也一样。 – Qtax 2011-05-17 20:28:28