【问题标题】:Regex to extract substring正则表达式提取子字符串
【发布时间】:2014-02-13 15:10:01
【问题描述】:

真的在为此苦苦挣扎...希望有人可以让我走上解决问题的正确道路。

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

66-2141-A-AC107-7

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

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

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

【问题讨论】:

    标签: php regex parsing


    【解决方案1】:

    这将满足您的需要:

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

    Debuggex Demo

    解释:

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

    你可以像这样在 PHP 中使用它:

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

    【讨论】:

    • 哇! Ed Cottrell...超越一切!清晰,简洁和解释。非常感谢
    • 很高兴为您提供帮助!请记住接受答案。 :)
    • 致反对者(我认为他是刚刚发表评论并删除评论的同一个人):从技术上讲,您是对的,^ 对于给出的示例不是必需的。为了清楚起见,我编辑了我的答案。
    • 不知道为什么有人会否决这个正确而有效的答案。 +1
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 对点星的使用非常差(而且不必要)。请注意:/^(.*-){3}(.*)-(.*)/ 在字符串中有超过 4 个连字符时会失败。请参阅:@Ed Cottrell 的回答,以获得更好的方法来制作这个正则表达式。如果您打算提供更多正则表达式相关问题的答案,您最好阅读Mastering Regular Expressions (3rd Edition)
    • 感谢您的链接,ridgerunner。我看看能不能买到那本书。我喜欢使用正则表达式,并且一直在寻找提高我在这方面技能的方法。 -瑞克
    • 保证你不会后悔的。 MRE3 是毫无疑问的,我读过的最有用的书。请注意,在我开始使用正则表达式之前,我已经专业编程了 30 多年(低级汇编、C、FORTRAN 等)。一旦我发现了它们(并阅读了 MRE3),就没有回头路了(我踢了自己 1000 次,因为没有早点学习它们)。现在我不能没有他们!正则表达式现在是我的(文本处理/编辑)工具箱中最强大的(是的,FUN)工具。
    • 是的,真的。我所收集到的关于 REGEX 的一切都是零零散散的。我没有人教我这些东西,所以我花了很长时间才最终适应使用它们。我的雇主有一个 Safari 在线帐户,所以在我们说话的时候,我正在获取那本书。再次感谢...我期待有一天成为 REGEX 大师! -瑞克
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多