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