我正在使用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)。
如何修复它(使正则表达式匹配什么,因为最后一个字符串不遵循与其他字符串相同的结构)?
答案 0 :(得分:1)
你的正则表达式是这样的:
/example\.(2015\.|)([0-9]{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)