发表回复 
正则-匹配模式的所有实例 V1.5
2014-09-13, 13 : 16 (这个帖子最后修改于: 2016-01-21 23 : 55 by robertL.)
Smile 正则-匹配模式的所有实例 V1.5
  • 方法×3:
    • 通过正则替换RegExReplace调出功能,记录各次匹配结果,各结果对应模式 3 (匹配对象)存储所有匹配结果至数组对象中。
      区分:使用正则替换(而非正则查找,配合继续查找后一个的调出(隐式地返回空值或显式地返回值0)(实际不进行任何替换)
      折叠块 :
      使用方法
      代码: (全选)
      for i,m in RegExMatchAll(h, n)
          s .="第" i "个匹配的实例:值:" m.Value(0) ",位置:" m.Pos(0) "`n"
      MsgBox % s
      h(Haystack)是正则查找的nNeedle是待查找目标
      代码(简要分析)
      代码: (全选)
      RegExMatchAll(str, pat, pos := 1)
      {
          static matches    ;见后"matches := []"
          if IsObject(str) ; 本函数同时作为正则的调出函数。
          {
              matches.Insert(str)    ;记录当前匹配(str)至数组对象(matches)。
              return    ;调出函数结束。返回空,继续向后匹配。
          }
          RegExMatch(pat, "sO)(^[^\(]*\))?(.*)", pat)    ;查找原模式中的选项。
          opt := pat.1 != "" ? pat.1 : ")"                ;提取原模式中的选项。
          pat := "O" opt "(?:" pat.2 ")(?C" A_ThisFunc ")"    ;构造新选项。保留原模式,并增加"O"(对象)模式、"?C"调出函数模式。
          matches := []        ;用于记录各个匹配结果。
          RegExReplace(str, pat, "",,, pos)    ;开始正则查找
          return matches    ;返回记录了各匹配结果的数组对象。
      }
      可能的局限,无法处理在匹配过程中改变的选项
    • 通过正则替换RegExReplace,返回由特殊字符分隔各个匹配结果组成所有结果之字符串,再通过StrSplit功能所有结果之字符串切分为包含各个结果的数组对象。
      折叠块 :
      使用方法及代码(简要分析)
      代码: (全选)
      s := ""    ;演示用记录数组对象切分后的各个匹配结果组成的字符串。
      for i,m in StrSplit(Trim(RegExReplace(h, "s).*?(" n "|$)", (d:=Ch r(31)) "$1"), d), d)
          s .= i "=" m "`n"
      MsgBox % s
      • h是正则查找的(Haystack),是正则查找的待查找目标n
      • |$确保最后一个匹配之后的非匹配部分仍被替换(会在Trim中移除掉)
      • Ch r(31)对应ASCII中一非可见字符,用以分隔RegExReplace替换后的各个结果,及StrSplit分隔所有结果至各个结果字符串。
    • 循环匹配,每次指定StartingPosition(本次搜索的起始位置)FoundPos+strlen(OutputVar)+1(上次搜索的结束位置),直至FoundPos为0(不再匹配)。 @cixiplc
      可使用RegExMatch模式 2 (位置长度),获取整个模式或部分子模式的匹配结果的的位置长度,并手动去子字符串。(感觉能更高效)
      折叠块 :
      代码: (全选)
      FoundPos := 0
      OutputVar=
      while FoundPos := RegExMatch(Haystack, NeedleRegEx, OutputVar, FoundPos+1){
          ;...
      }
  • 参见
    折叠块 :
  • 其他关键词:正则全局匹配/全局模式/匹配全部/匹配所有。

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 4用户表示感谢robertL
2016-01-13, 22 : 04 (这个帖子最后修改于: 2016-01-21 21 : 52 by tmplinshi.)
RE: 正则-匹配模式的所有实例 V1.5
(2014-09-13 13 : 16)robertL 提到:  FoundPos := 0
OutputVar=
while FoundPos := RegExMatch(Haystack, NeedleRegEx, OutputVar, FoundPos+strlen(OutputVar)+1){
;...
}
@robertL 上面的写法不对哦。测试代码:

代码: (全选)
Haystack := "123456789"
NeedleRegEx := "\d{3}"

FoundPos := 0
OutputVar=
while FoundPos := RegExMatch(Haystack, NeedleRegEx, OutputVar, FoundPos+strlen(OutputVar)+1){
    out .= OutputVar ","
}
MsgBox, % out ; 结果为 123,567,。正确的结果应该是 123,456,789,。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-01-22, 00 : 01
RE: 正则-匹配模式的所有实例 V1.5
@tmplinshi 哦,对,上面错了。
代码: (全选)
FoundPos := 1  ;改这里
OutputVar=
while FoundPos := RegExMatch(Haystack, NeedleRegEx, OutputVar, FoundPos+strlen(OutputVar)){  ;和这里
    out .= OutputVar ","
}
MsgBox, % out ; 结果为 123,456,789,。
谢谢提醒~
类似的可换成对象O)模式,返回最终匹配数组,貌似更清晰..类似思路..用到时再补充过来...

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2016-07-12, 12 : 22
RE: 正则-匹配模式的所有实例 V1.5
Thank you!
终于不用一个一个造轮子了。

一次可以正则取出所有匹配的内容
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合