2014-02-13 291 views
2

真的很难与此...希望有人可以把我的解决方案的正确路径。正则表达式提取字符串

我的输入字符串的结构是这样的:

66-2141-A-AC107-7

我感兴趣的提取字符串 'AC107' 用一个正则表达式。我知道如何用其他PHP字符串函数来做到这一点,但我必须用正则表达式来做到这一点。

我需要的是提取第三和第四个连字符之间的所有数据。每个部分的结构不固定(即,66可以是8798709和2141可以是38)。连字符数量的存在是有保证的(即,总是会有四(4)个连字符)。

任何帮助/指导,非常感谢!

回答

3

这将你需要的东西:

(?:[^-]*-){3}([^-]+) 

Regular expression visualization

Debuggex Demo

说明:

  • (?:[^-]*-)查找零个或多个非连字符后跟一个连字符
  • {3}查找三个块刚刚描述
  • ([^-]+)捕获所有的连续的非连字符从该点向前(自动将先下一切断连字符)

可以在PHP中使用这样的:

$str = '66-2141-A-AC107-7'; 
preg_match('/^(?:[^-]*-){3}([^-]+)/', $str, $matches); 
echo $matches[1]; // prints AC107 
+0

哇! Ed Cottrell ......超越!清晰,简洁并有解释。非常感谢你 –

+0

很高兴帮助!请记住接受答案。 :) –

+0

对于downvoter(我认为谁是刚才评论和删除评论的同一个人):从技术上讲,你是对的,对于给出的例子来说'^'不是必需的。为了清晰我编辑了我的答案。 –

0

这应该寻找任何后面跟一个连字符3次,然后在组2(第二组括号)它会有你的价值,其次是连字符和其他任何东西。

您可以使用$ 2来访问它。在PHP中,这将是这样的:

$string = '66-2141-A-AC107-7'; 
preg_match('/^(.*-){3}(.*)-(.*)/', $string, $matches); 
$special_id = $matches[2]; 
print $special_id; 
+0

很差(和不必要的)使用点星。注意:当字符串中有4个连字符时,'/ ^(。* - ){3}(。*) - (。*)/'失败。请参阅:@Ed Cottrell的答案,以更好地制作此正则表达式。如果你打算提供更多的正则表达式相关问题的答案,你最好去阅读[掌握正则表达式(第三版)](http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/ dp/0596528124“通过杰弗里弗里德尔。最好的书对正则表达式 - 永远!”)。 – ridgerunner

+0

谢谢你的链接,ridgerunner。我会看看我能否获得这本书。我喜欢与正则表达式一起工作,我一直在寻找方法来提高我在这方面的技能。 -Rick – Quixrick

+0

我_guarantee_你不会后悔的。 MRE3是手下,我读过的最有用的书。请注意,在我开始使用正则表达式之前,我专业编程了30多年(低级别汇编,C,FORTRAN等)。一旦我发现了它们(并且读了MRE3),就没有回头路了(我自己踢了1000次,因为没有及时学会)。现在,我离不开他们!正则表达式现在是我的(文本处理/编辑)工具箱中功能最强大的(也是,_FUN_)工具。 – ridgerunner