是否可以匹配字符串的特定索引之间的正则表达式

时间:2013-03-15 11:11:48

标签: regex

例如,如果我有一个电话号码,我想看看最后两位数中的任何一个是否包含7.我可以完全用正则表达式做这个吗?还是我必须首先将字符串分开?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式:

7\d?$

在末尾或倒数第二个位置匹配7。或者,更确切地说,它匹配字符串末尾的7,可选地后跟另一个数字,在最后两个位置之一转换为7。

答案 1 :(得分:0)

您可以使用环视匹配字符串的任意索引,我们使用look-behind (?<=)来检查我们是否有start of string后跟固定数量的字符剩下。并预览(?=),检查我们是否有一个固定数量的字符,然后是end of string

字符串开头的索引:

(?<=^.{N})REGEX

您的REGEX将与第N个(从零开始)索引匹配,因此,如果您要检查左侧的第3个字符是否为x,请填写以下字符串12x45那么你可以使用(?<=^.{2})x x是正则表达式来检查字符是否为x

使用先行,你可以从最后开始做同样的事情:

REGEX(?=.{N}$)

因此,为了检查最后2位数中的任何一位是否为7,你的正则表达式将是7\d?(?=.{0}$)(这相当于Joey所建议的。但是你可以看到这对所有索引都适用(不是说你应该使用它而不是更简单的,它只是一个更通用的正则表达式。

如果你想检查左边第3个(从零开始)的字符是x,那么你就不会有x(?=.{2}$)

您还可以将两者结合起来检查索引,例如你想检查两端的第三个数字之间的所有内容是x12xxxxxx21的任意数量,那么你有以下内容:

(?<=^.{2})x*(?=.{2}$)


注意:
如果你只想要一个匹配/不匹配正则表达式,那么你可以没有环顾四周,但那么你将匹配整行而不是你在REGEX中指定的内容。

e.g:

对于上面的示例,

(?<=^.{2})x*(?=.{2}$)会匹配xxxxxx,其中^.{2}x*.{2}$将匹配字符串,但它会与整个事物(12xxxxxx21)匹配仅xxxxxx