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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘