正则表达式或匹配我不想要的东西

时间:2015-03-15 21:18:50

标签: php regex

我正在使用PHP。

我有一个字符串:

example.123.somethingelse
example.1234.somethingelse
example.2015.123.somethingelse
example.2015.1234.somethingelse

我想出了这个正则表达式

/example\.(2015\.|)([0-9]{3,4})\./

我想得到的是" 123"或" 1234"它适用于这些字符串。但是当字符串是

example.2015.A01.somethingelse

结果是" 2015"。

我看到它的方式,在" 2015之后。"我有" A"这不应该与正则表达式匹配,但它是(并且我认为有一个坚实的理由,我不理解atm)。

如何修复它(使正则表达式匹配什么,因为最后一个字符串不遵循与其他字符串相同的结构)?

5 个答案:

答案 0 :(得分:1)

你的正则表达式是这样的:

/example\.(2015\.|)([0-9]{3,4})\./

那说

  • 第一场比赛"示例"接下来是一段时间
  • 然后匹配" 2015"然后是一段时间或根本没有。
  • 然后连续匹配3位或4位数字,后跟句号

当你有字符串example.2015.A01.somethingelse时,它与"example.2015."匹配,但是,正如你所说,"A"会使其混乱,因此它会回溯并匹配"example."(请记住" OR"允许 nothing 匹配)。因此它匹配"example."后跟NOTHING后跟3或4位数字 - 因为"2015"是4位数字,它与"example.2015"相匹配。

从您的描述中很难说清楚,但我认为您的竖条位置错误:

/example\.(2015\.)|([0-9]{3,4})\./

那应该与EITHER" example.2015匹配。"或数字如123 - 但" 2015"仍然是一行中的4位数字,因此它仍然匹配。我对模式没有足够的了解,无法弄清楚如何避免这种模式。

答案 1 :(得分:0)

也许使用\d+并获取数组中的第一个结果。

答案 2 :(得分:0)

在正则表达式中,您使用以下内容:

(2015\.|)

这允许正则表达式匹配2015. 空字符串(零个字符)。

当正则表达式example\.(2015\.|)([0-9]{3,4})\.应用于以下示例时:

example.2015.A01.somethingelse

它将匹配文字字符example,然后匹配(2015\.|)的空字符串,然后使用([0-9]{3,4})\.匹配字符串2015,这是4个数字字符。因此,您的表达式符合以下内容:

example.2015.

答案 3 :(得分:0)

您似乎需要possessive quantifier

/example\.(2015\.)?+([0-9]{3,4})\./

2015.仍然是可选的,但是一旦正则表达式与之匹配,它就不会放弃,即使这会导致匹配失败。我假设您尝试使用([0-9]{3,4})捕获的子字符串永远不会具有值2015。也就是说,你不需要匹配这样的东西:

    example.2015.somethingelse

如果情况并非如此,那将会更加复杂。

答案 4 :(得分:0)

这里还有一个模式

example\.(?:2015\.)?\K(\d+)

Demo

或您的具体数字

example\.(?:2015\.)?\K(\d{3,4})