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


Regex OR matching stuff that I dont want

我正在使用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)。

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

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

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

也就是说

  • 第一个匹配"示例"后跟一个句点
  • 然后匹配"2015",后跟一个句点或根本不匹配。
  • 然后连续匹配 3 或 4 位数字,后跟一个句点

当你有字符串example.2015.A01.somethingelse它与"example.2015."匹配时,但正如你所说,"A"把它搞砸了,所以它回溯并只匹配"example."(记住"OR"允许任何匹配)。所以它匹配"example."后跟 NOTHING,后跟 3 或 4 位数字——因为"2015"是 4 位数字,所以它可以轻松地匹配"example.2015"

很难从您的描述中看出,但我认为您只是有一个放错位置的垂直条:

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

这应该与"example.2015"匹配。或数字,如 123 - 但"2015"仍然是连续 4 位数字,因此它仍然匹配。我对模式没有足够清晰的想法来弄清楚如何避免这种情况。

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

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

(2015'.|)

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

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

example.2015.A01.somethingelse

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

example.2015.

看起来你需要一个所有格量词:

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

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

    example.2015.somethingelse

如果不是这样,情况会复杂得多。

这是另一种模式

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

演示

或您的特定位数

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