; 应留意效率问题,如果函数匹配对象太多的话。函数[约214ms耗时]不如Loop每行[约143ms耗时]

text=
(
︹︹
  aaa
1111
︺︺
fdfdf
12312
︹︹
ccc ddd
333
︺︺
)

regex := "︹︹\n(.*?)\n︺︺"
arr:=RegExMatchAll(text, regex)
MsgBox % "返回方式1:`n" arr[1][0] "`n`n返回方式2:`n" arr[2][1]


text := "澳” 1.00让半球/一 半球/让0.78"

; regex := "(\S{2})\s*/\s*(\S)"  ; 获取/左两个字和右一个字为结果
arr:=RegExMatchAll(text, "(\S)\s*/\s*(\S)")  ; 获取/左一个字和右一个字为结果
MsgBox % "结果1:`n" arr[1][0] "`n`n结果2:`n" arr[2][0]


str:="第10台156手=【对局结果】'帝国投石机(1.0段)'执黑 时间胜 '恶魔家园(1.0段)'执白"
re:="(?<=\')\S*(?=\()"
arr:=RegExMatchAll(str, re)
MsgBox % arr[1][0] "`n" arr[2][0]

; str := "aaa123===bbb456"
; re := "([ab]+)(\d+)"
; For k,v in arr:=RegExMatchAll(str, re)
;   MsgBox % "第 " k " 个匹配的第 2 个子匹配是:" v[2]

;----------------------------------
; 简单的 RegExMatchAll  By FeiYue
;----------------------------------
; 返回值为所有找到的匹配的二级数组,没找到返回0
; 第一级是所有找到的匹配
; 第二级是每个找到的匹配的多个字符串构成的简单数组
;     数组[0]表示整个匹配的字符串
;     数组[N]表示第N个子模式匹配的字符串
;----------------------------------
RegExMatchAll(str, re, pos:=1) {
  arr:=[], len:=StrLen(str)
  ; 给正则表达式re添加大欧选项O)
  re:=RegExMatch(re, "^[\w\s`a]*\)") ? "O" re : "O)" re
  While pos:=RegExMatch(str, re, Match, pos) {
    if (len0:=Match.Len(0))<1 {
      pos++
      if (pos>len)
        Break
    } else {
      pos+=len0, arr2:=[]
      Loop % Floor(Match.Count())+1
        arr2[A_Index-1]:=Match[A_Index-1]
      arr.Push(arr2)
    }
  }
  return arr.Length() ? arr : 0
}


/*   ; 老版本有 对于re="",就会死循环的Bug
RegExMatchAll(str, re) {
    ; 给正则表达式re添加大欧选项O)
    re:=RegExMatch(re, "^[\w\s`a]*\)") ? "O" re : "O)" re
    , arr:=[], pos:=1
    While pos:=RegExMatch(str, re, Match, pos) {
        if Match.Len(0)<1 and (pos++ or 1)
            Continue
        pos+=Match.Len(0), arr2:=[]
        Loop % Floor(Match.Count())+1
            arr2[A_Index-1]:=Match.Value(A_Index-1)
        arr.Push(arr2)
    }
    return arr.Length() ? arr : 0
}
*/

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。