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

评论(0)