我对正则表达式感到疯狂。我有一个这样的字符串:
%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)
我需要的是一个与以下内容匹配的正则表达式:
%closed%
%closed_percent%
%open%
%open_percent%
但不是两个\%
目前我使用:
\%([^\%]+)\%
给了我:
%closed%
%closed_percent%
%), %
% open (%
...
任何人都可以帮助我吗?
答案 0 :(得分:2)
简单的方法:
%\w+%
匹配:%foo%
允许(多个)反斜杠转义:
(?<!\\)(?:\\.)*%(\w+)%
仅匹配bar
中的\%foo% \\%bar% \\\%baz%
...这也允许它内部的转义:
(?<!\\)(?:\\.)*%((?:[^\\%\s]+|\\.)+)%
匹配:%foo\%bar%
使用第一个捕获组的值和最后两个表达式。
答案 1 :(得分:1)
试试这个:
\%([^(\\\%)]+?)\%
匹配
%closed%
%closed_percent%
%open%
%open_percent%
对我来说。
答案 2 :(得分:1)
假设对百分比包装标记(包括转义字符)中的内容没有限制,以及可以转义哪些字符(因此反斜杠也可以转义:\\%token%
应该有效),
这是一个可以用来跳过转义字符的模式:
\\.|(%([^%\\]|\\.)+%)
这将捕获百分比包装的标记,并将在第一组($1
)中捕获它们。转义的字符也将匹配(这是跳过它们的一个很好的技巧),但使用PHP很容易得到相关的标记:
preg_match_all('/\\\\.|(%([^%\\\\]|\\\\.)+%)/', $str, $matches, PREG_PATTERN_ORDER);
$matches = array_filter($matches[1]);
答案 3 :(得分:0)
尝试:
~\%\w+\%~
因此,在您的选择中只允许使用a-z A-Z和_。
$str = "%closed% closed (%closed_percent%\%), %open% open (%open_percent%\%)";
preg_match_all("~\%\w+\%~", $str, $matches);
$matches
现在包含:
Array
(
[0] => Array
(
[0] => %closed%
[1] => %closed_percent%
[2] => %open%
[3] => %open_percent%
)
)
答案 4 :(得分:0)
为反斜杠添加负面的lookbehinds!这样就会忽略\%
。
(?<!\\)\%([^\%]+)(?<!\\)\%
匹配
%关闭%
%closed_percent%
%打开%
%open_percent%