例如,如果我有一个电话号码,我想看看最后两位数中的任何一个是否包含7.我可以完全用正则表达式做这个吗?还是我必须首先将字符串分开?
答案 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}$)
。
您还可以将两者结合起来检查索引,例如你想检查两端的第三个数字之间的所有内容是x
中12xxxxxx21
的任意数量,那么你有以下内容:
(?<=^.{2})x*(?=.{2}$)
注意:强>
如果你只想要一个匹配/不匹配正则表达式,那么你可以没有环顾四周,但那么你将匹配整行而不是你在REGEX
中指定的内容。
e.g:
对于上面的示例, (?<=^.{2})x*(?=.{2}$)
会匹配xxxxxx
,其中^.{2}x*.{2}$
将匹配字符串,但它会与整个事物(12xxxxxx21
)匹配仅xxxxxx
。