正则表达式提取子串

时间:2014-02-13 15:10:01

标签: php regex parsing

真的很挣扎......希望有人能让我走上解决问题的正确道路。

我的输入字符串的结构如下:

66-2141-A-AC107-7

我有兴趣使用单个正则表达式提取字符串'AC107'。我知道如何使用其他PHP字符串函数执行此操作,但我必须使用正则表达式执行此操作。

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这应该查找任何后跟连字符3次然后在第2组(第二组括号)中的任何内容,它将具有您的值,然后是另一个连字符和其他任何内容。

/^(.*-){3}(.*)-(.*)/

您可以使用$ 2访问它。在php中,它会是这样的:

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