我想写一个提取短信验证码的正则表达式。一般是特定字符加4到8位数字。
比如文字有可能是 abc或def或hij中的一个,4到8位数字,有可能数字在字符之前,也有可能是在字符之后.即:有可能是 def asdklfoiaweioeawoi 4567 也有可能是
4567 def asdklfoiaweioeawoi
。匹配成功后取出指定的数字作为验证码。但是
我自己写过
(?=abc|def|hij)(\D(\d{4,8})\D)或(?<=abc|def|hij)(\D(\d{4,8})\D)均匹配不到。
请各位高手指教。
再帮你解答下为什么你写的两个正则(?=abc|def|hij)(\D(\d{4,8})\D),(?<=abc|def|hij)(\D(\d{4,8})\D)匹配不到def asdklfoiaweioeawoi 4567或4567 def asdklfoiaweioeawoi。题主写的第一个正则(?=abc|def|hij)(\D(\d{4,8})\D),意思如下:先匹配一个位置,该位置的后面是abc3个字符或def3个字符或
hij3个字符,接着匹配一个非数字字符再匹配连续4至8个的数字,再匹配一个非数字。根据你的匹配要求,首先将(?=abc|def|hij)(\D(\d{4,8})\D)改为
(?=abc|def|hij)(\D+(\d{4,8})\D),这样才能够匹配到如' asdklfoiaweioeawoi '的部分,原来的写法只会匹配一个字符;再将(?=abc|def|hij)(\D+(\d{4,8})\D)改为(?=abc|def|hij)(\D+(\d{4,8})(\D*)?),因为\d{4,8}\D强制要求了数字后面要跟一个非数字,这是跟你的规则不符的,改为可有可无;实际最后的\D是不需要的,因为匹配完最后的数字,完整的规则已经全部匹配了,修改如下:(?=abc|def|hij)(\D+(\d{4,8})),到这里,其实已经匹配成功了,如下:
只是,(?=abc|def|hij)(\D+(\d{4,8}))还是有缺陷的,后续要提取数字的话,会麻烦些,需要再做判断,因为这个正则有多个捕获组,每个()中的内容都会捕获到的,所以还需要将不需要的数据不进行捕获,只捕获数字部分,修改如下:(?=abc|def|hij)\D+(\d{4,8})。
第二个正则(?<=abc|def|hij)(\D(\d{4,8})\D),是回溯匹配,实际跟(?=abc|def|hij)(\D(\d{4,8})\D)一样只能够满足字符在数字之前这一种情况,跟第一种不同的是它是先匹配一个位置,这个位置的前面是abc3个字符或def3个字符或hij3个字符,其余匹配规则是一致的。望采纳。。。
直接 \d{4,8} 就可以了。
如果仅是取出数字的话,1楼楼主给出的正则就可以做到了;如果要在匹配成功的基础上再取出数字,可以试下如下正则:/(?:\s*(?:abc|def|hij)\D*(\d{4,8}))|(?:\s*(\d{4,8})\s*(?:abc|def|hij)\D*)/。这是根据题主给出的规则及两个示例写的。附上截图(js下验证):