我有这句话
C:\\wamp\\www\\callCenter\\joomlatools-files\\docman-files\\test.pdf
我希望得到正则表达式测试的结果,但不使用句子中的其他单词。
我的正则表达式是~\\\(.+)\.pdf~
,但结果是wamp\www\portail-callcenter\joomlatools-files\docman-files\test
。
有人可以解释一下如何完成它吗?
答案 0 :(得分:2)
我不确定你想要得到什么。但我想你想从你的第一句话中得到test
这个词。所以使用这种模式:
~\\\\(\w+)\.pdf$~
然后$1
包含您需要的内容。
~
分隔符\\\\
按字面意思匹配两个反斜杠(
抓取小组$1
(包含您需要的内容) \w+
匹配一个或多个字母,数字或下划线\.
按字面匹配$
字符串结尾以下是问题~\\\(.+)\.pdf~
中的模式。您的模式问题是.+
。因为它意味着一个或多个字符(每个字符甚至\
)。因此,您的模式匹配字符串开头的两个反斜杠,其余的反斜杠将匹配每个字符(.+
)。
为避免这种情况,您必须使用\w
代替任何字母,数字或下划线。在这种情况下,匹配的部分将只是test
。
答案 1 :(得分:1)
你的正则表达式几乎是正确的。唯一的事情是它匹配最终单词中的每种类型的角色。将其更改为
~\\\\([^\\]+)\.pdf~
除了最后一个单词中的\
之外,其他所有内容都匹配 - 您应该只获取文件名。
此致
答案 2 :(得分:1)
从test
获取C:\\wamp\\www\\callCenter\\joomlatools-files\\docman-files\\test.pdf
:
(?<=\\\\)[^.\\]+(?=\.[^.\\]+$)
https://groups.google.com/forum/#!msg/gremlin-users/AetuGcLiBxo/KW966WAyAQAJ
您可以通过使用组来获取所需部分来避免外观:
\\\\([^.\\]+)\.[^.\\]+$
答案 3 :(得分:1)
<?php
$subject = 'C:\\\\wamp\\\\www\\\\callCenter\\\\joomlatools-files\\\\docman-files\\\\test.pdf';
echo $subject; // C:\\wamp\\www\\callCenter\\joomlatools-files\\docman-files\\test.pdf
preg_match_all('~\\\\\\\\([^\\\\]+)\.pdf$~', $subject, $match);
var_dump($match);
结果
array (size=2)
0 =>
array (size=1)
0 => string '\\test.pdf' (length=10)
1 =>
array (size=1)
0 => string 'test' (length=4)
如果你想匹配双反斜杠,你的正则表达式需要8个反斜杠。在第一级中,解析脚本行中的字符串输入,并将反斜杠视为元字符,以转义后续字符。结果,你的正则表达式中仍有4个斜线。执行正则表达式时,会对反斜杠和元字符进行处理,因此仍需要2个斜杠与主题字符串进行比较。
echo '~\\\\\\\\([^\\\\]+)\.pdf$~'; // ~\\\\([^\\]+)\.pdf$~