在长句与关键词之间进行匹配

时间:2014-07-23 19:16:15

标签: regex

目标句子:

$(SolDir)..\..\ABC\ccc\1234\ccc_am_system;$(SolDir)..\..\ABC\ccc\1234\ccc_am_system\host;$(SolDir)..\..\ABC\ccc\1234\components\fds\ab_cdef_1.0\host;    $(SolDir)..\..\ABC\ccc\1234\somethingelse;

我应该如何构建我的正则表达式以提取项目包含" .. \ .. \ ABC \ ccc \ 1234 \ ccc_am_system"

基本上,我想提取所有这些文件夹,可能更多,它们都在\ ABC \ ccc \ 1234 \ ccc_am_system:

$(SolDir)..\..\ABC\ccc\1234\ccc_am_system\host\abc;
$(SolDir)..\..\ABC\ccc\1234\ccc_am_system\host\123\123\123\123; 
$(SolDir)..\..\ABC\ccc\1234\ccc_am_system\host;

我当前的正则表达式不起作用,我无法弄清楚为什么

\$.*ccc\\1234\.*;

3 个答案:

答案 0 :(得分:1)

您的问题很可能是*是一个贪婪的运算符。它贪婪地匹配比你想要的更多。在许多正则表达式方言中,*?是不情愿的运算符。我会先尝试使用它:

\$.*?ccc\\1234.*?;

您可以阅读更多有关贪婪与不情愿的操作员in this question的信息。

如果这不起作用,您可以尝试使用匹配的字符比.更具体。例如,您可以将每个非分号字符与以下表达式匹配:[^;]*。你可以这样使用这个想法:

\$[^;]*ccc\\1234[^;]*;

答案 1 :(得分:0)

以下正则表达式会将捕获的字符串存储在组1中。

(\$.*?ccc\\1234\\.*?;)

您需要通过在*旁边添加?来使*量词符号进行最短匹配。并且此\.*匹配文字点零次或多次。这是错的。

DEMO

答案 2 :(得分:0)

我发现这是最好的:

\$(.[^\$;])*ccc\\1234(.[^\$;])*;

它不允许任何过度匹配,如果我使用?,它仍然匹配更多$或;不止一次由于某种原因,但有了上述表达,这将永远不会是这种情况。还要感谢所有花时间回答我的问题的人,。