gotosapa 2018-07-12 07:19 采纳率: 33.3%
浏览 514
已采纳

DELPHI下正则表达式问题请教各位大侠

我想写一个提取短信验证码的正则表达式。一般是特定字符加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)均匹配不到。
请各位高手指教。

  • 写回答

3条回答 默认 最新

  • Yirujet 2018-07-13 02:47
    关注

    再帮你解答下为什么你写的两个正则(?=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个字符,其余匹配规则是一致的。望采纳。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 lingo代码报错无法运行,如何解决,如果能解决请提供能够运行的lingo代码
  • ¥100 读取 IMU BNO080 数据
  • ¥15 基于RTKLIB框架写的精密单点定位-AR
  • ¥15 PFENet的预训练权重
  • ¥15 程序哪有错误怎么改?
  • ¥15 交换机和交换机之间的链路带宽以及主机带宽的理解
  • ¥15 ai创想家对战模式代码
  • ¥15 集合A由3个2行4列二维数组构成,从集合A中任意取一个二维数组元素、如果该二维数组元素的对应列位置的上、下两数都是奇数,而且仅有2个列是奇数/奇数,则该数组有意义,并放入集合B中打印输出。
  • ¥15 电信IPV6 无法外网访问吗
  • ¥15 有偿求效果比较好的遥感影像匹配的c++代码