php - 正则表达式提取第二个破折号/连字符之前的所有字符

标签 php regex

我需要一个 php 正则表达式来提取此类字符串中第二个破折号/连字符之前的所有字符:

EDM-2112-100-2013 ==> EDM-2112 ABCD-2002-100-2014 ==> ABCD-2002

而且,我知道我可以使用各种字符串操作函数来完成此操作(substr 等),但它必须是正则表达式。我们使用正则表达式来定义客户特定的规则,这些规则在数据呈现时进行评估。提供数据后,我们将数据库中的客户特定正则表达式应用到入站数据,然后处理提取的数据。

最佳答案

您可以使用此模式:

\A(?:[^-]++-??){2}

图案详细信息:

\A            # anchor for the start of the string
(?:           # open a non-capturing group
    [^-]++    # all that is not an hyphen (possessive)
    -??       # optional hyphen (lazy)
){2}          # repeat the group 2 times

我承认这种模式有点棘手。它利用了 possessive quantifier 的事实即使量词是惰性的,在第一次出现时强制使用连字符。第二次出现时,连字符不匹配。

你可以写得更简单:\A[^-]+-[^-]+

如果你想检查匹配后是否有第二个连字符,你只需要添加这个 lookahead在两种模式之一的末尾:(?=-)

关于php - 正则表达式提取第二个破折号/连字符之前的所有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25448921/

相关文章:

php - laravel 网站 session 在 iframe 中不起作用

Python正则表达式与文件扩展名匹配

php - 将变量从 php 发送到 iOS

php - 禁用主键/唯一键排序

PHP在多维数组上嵌套foreach

regex - 我应该在 Pig Latin 中使用什么类型的分隔符来处理 apache 日志?

javascript - 使用正则表达式从字符串中获取值

php - 从这四个中获取单个 MySql 查询

jquery - 使用 jquery 从 HTML 页面中提取名称

javascript - 用 JavaScript 正则表达式替换 iOS 11 智能标点符号