/*
安好… 2022-4-1 13:41:32
我现在急需一个数值区间处理返回该区间的正则方法,求指导,昨天捣鼓了好久,弄不好
梦醒(FeiYue) 2022-4-1 13:45:23
 正则判断还不如if判断
if (n>100 && n<9999)
安好… 2022-4-1 13:51:44
比如我在游戏商城买东西,我可以在搜索框用正则筛选价格区间
安好… 2022-4-1 13:51:57
搜索框只支持简单的正则模式
安好… 2022-4-1 13:52:34
比如234-743  , 生成一个正则, 录入商城的搜索框,就可以筛选出该范围匹配的内容
梦醒(FeiYue) 2022-4-1 14:01:42
最简单的就是
234|235|...|700|..|743|[3-6]..
安好… 2022-4-1 14:03:03
字符长度有限制
安好… 2022-4-1 14:03:22
唯一比较有效的就是正则
梦醒(FeiYue) 2022-4-1 14:04:56
200-700取这种简单的
[2-6]..|700
安好… 2022-4-1 14:12:15
所以啊,我才需要一个函数来转换成标准的
安好… 2022-4-1 14:13:05
复杂的最高也只有6组吧
空 2022-4-1 14:13:37
234-743 你就把这个转个正则看看
梦醒(FeiYue) 2022-4-1 14:13:47
自己限制成简单的不就行了,比如200-700的
[2-6]..|700
安好… 2022-4-1 14:17:13
反正实际情况就是只能把甚至区间转换正则才行
安好… 2022-4-1 14:27:15
  [2][3][4-9]|[2][4-9][0-9]|[3-6][0-9]{2}|[7][0-3][0-9]|[7][4][0-3]
*/

Global n:=0

MsgBox % gen(1050, 2400)   ; 递归超出次数报错
; MsgBox % gen(111, 444)

gen(a, b, q := "") {
    if !q {
     /* V2写法
        a := String(Integer(a))
        b := String(Integer(b))
    */ ; V1写法 
        if a > b
            t := a, a := b, b := a
        a := Format("{:d}", a)
        b := Format("{:d}", b)
    }
    la := StrLen(a), lb := StrLen(b), s := ""

    if (la < lb) {
     /* V2写法
        loop (t := "", la)
    */ ; V1写法 
        loop % t := ""    la
            t .= "9"
        return gen(a, t, q) "|" gen("" t + 1, b, q)
    } else if (la == 1) 
        return q (a == b ? a : a = "0" && b = "9" ? "\d" : "[" a "-" b "]")
         else {
            sa := SubStr(a, 1, 1) + 0, sb := SubStr(b, 1, 1) + 0
            ua := SubStr(a, 2) + 0 ? sa + 1 : sa
            if (sa == sb)
                return gen(SubStr(a, 2), SubStr(b, 2), q sa)
            else if (ua < sb) {
                if ua && !(a ~= "^[1-9]0*$")
                    s := gen(a, Format("{:0" la "d}", ua * (10 ** (la - 1)) - 1), q)
                if (b ~= "^9+$")
                    s .= "|" q (ua = 9 ? "9" : "[" ua "-9]") (lb > 2 ? "\d{" (lb - 1) "}" : "\d")
                else {
                    db := sb - 1
                    s .= "|" q (db == ua ? ua : ua = "0" && db = "9" ? "\d" : "[" ua "-" db "]") "\d" (lb > 2 ? "{" (lb - 1) "}" : "")
                    s .= SubStr(b, 2) + 0 ? "|" gen(Format("{:0" lb "d}", sb * (10 ** (lb - 1))), b, q) : "|" q b
                }
            } else {
                if ua
                    s .= "|" gen(a, Format("{:0" la "d}", ua * (10 ** (la - 1)) - 1), q)
                s .= SubStr(b, 2) + 0 ? "|" gen(Format("{:0" lb "d}", sb * (10 ** (lb - 1))), b, q) : "|" q b
            }
        }
        return LTrim(s, "|")
}


; 原函数备份第一版,会递归次数超出
; gen(a, b, q := "") {
;     if !q {
;      /* V2写法
;         a := String(Integer(a))
;         b := String(Integer(b))
;     */ ; V1写法 
;         a := Format("{:d}", a)
;         b := Format("{:d}", b)
;     }
;     la := StrLen(a), lb := StrLen(b), s := ""
; 
;     ToolTip % "递归次数:" ++n
; 
;     if (la < lb) {
;      /* V2写法
;         loop (t := "", la)
;     */ ; V1写法 
;         loop % (t := "", la)
;             t .= "9"
;         s := gen(a, t, q)
;         return s "|" gen("" t + 1, b, q)
;     } else if (la == 1) {
;         return q (a == b ? a : a = "0" && b = "9" ? "\d" : "[" a "-" b "]")
;         } else {
;             sa := SubStr(a, 1, 1) + 0, sb := SubStr(b, 1, 1) + 0
;             ua := SubStr(a, 2) + 0 ? sa + 1 : sa
;             if (sa == sb) {
;                 return gen(SubStr(a, 2), SubStr(b, 2), q sa)
;             } else if (ua < sb) {
;                 if ua && !(a ~= "^10*$")
;                     s .= "|" gen(a, "" ua * (10 ** (la - 1)) - 1, q)
;                 if (b ~= "^9+$")
;                     s .= "|" q (ua = 9 ? "9" : "[" ua "-9]") (lb > 2 ? "\d{" (lb - 1) "}" : "\d")
;                 else {
;                     db := sb - 1
;                     s .= "|" q (db == ua ? ua : ua = "0" && db = "9" ? "\d" : "[" ua "-" db "]") "\d" (lb > 2 ? "{" (lb - 1) "}" : "")
;                     s .= SubStr(b, 2) + 0 ? "|" gen("" sb * (10 ** (lb - 1)), b, q) : "|" q b
;                 }
;             } else if (ua == sb) {
;                 if ua
;                     s .= "|" gen(a, "" ua * (10 ** (la - 1)) - 1, q)
;                 s .= SubStr(b, 2) + 0 ? "|" gen("" sb * (10 ** (lb - 1)), b, q) : "|" q b
;             } else {
;         
;             }
;         }
;     return LTrim(s, "|")
; }

 

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