找回密码
 加入
搜索
查看: 1909|回复: 12

[网络通信] [已解决]问个正则,并优化一下。

[复制链接]
发表于 2018-8-13 18:32:02 | 显示全部楼层 |阅读模式
本帖最后由 志艺风云 于 2018-8-14 16:13 编辑

$Combo4Text 值可能为(不分大小写):
SELECT * FROM 任意字符
SELECT 任意字符 FROM 任意字符
select 任意字符 INTO 任意字符 from 任意字符
INSERT INTO 任意字符
DELETE FROM 任意字符

这两个if 的$Combo4Text 正则?能不能只用一个IF?实际即是 为空或者开始含有SELECT且不是select 任意字符 INTO 任意字符


Local $Combo4Text = GUICtrlRead($Combo4)
If $Combo4Text = "" Or StringLeft($Combo4Text, 6) = "SELECT" Then
        If Not StringRegExp($Combo4Text, "(?i)^SELECT .* into .* from .*") Then
                _OpenTables($Combo4Text)
        Else
                _ExecuteSql($Combo4Text)
        EndIf
Else
        _ExecuteSql($Combo4Text)
EndIf




 楼主| 发表于 2018-8-14 13:44:15 | 显示全部楼层
本帖最后由 志艺风云 于 2018-8-14 14:49 编辑

就是这个正则应该是什么,不分大小写
这个字符串的结果为真:SELECT 任意字符 FROM 任意字符 INTO 任意字符
这个字符串的结果为假:select 任意字符 INTO 任意字符 from 任意字符
这个字符串的结果为假:任意字符

即是开始有"SELECT "且不为 "select 任意字符 INTO 任意字符 from 任意字符"的正则结果为真
发表于 2018-8-14 15:14:14 | 显示全部楼层
简单的问题被你描述成这样也是强~
既然描述不清,最基本的可运行脚本也没有
 楼主| 发表于 2018-8-14 16:10:00 | 显示全部楼层
afan 发表于 2018-8-14 15:14
简单的问题被你描述成这样也是强~
既然描述不清,最基本的可运行脚本也没有

感谢大佬,这就是我想要的,需然看不明白那正则

Local $Combo4Text[7]
$Combo4Text[0] = ""
$Combo4Text[1] = "SELECT * FROM 任意字符"
$Combo4Text[2] = "SELECT 任意字符 FROM 任意字符"
$Combo4Text[3] = "SELECT 任意字符 FROM 任意字符 INTO 任意字符"
$Combo4Text[4] = "select 任意字符 INTO 任意字符 from 任意字符"
$Combo4Text[5] = "INSERT INTO 任意字符"
$Combo4Text[6] = "任意字符"

For $i = 0 To 6
        If $Combo4Text[$i] = "" Or StringRegExp($Combo4Text[$i], "(?mi)^SELECT(?:(?!into.*?from).)+$") Then
                MsgBox(0, "正则测试 " & $i, "字符串:" & $Combo4Text[$i] & @CRLF & "结果为 真")
        Else
                MsgBox(0, "正则测试 " & $i, "字符串:" & $Combo4Text[$i] & @CRLF & "结果为 假")
        EndIf
Next

发表于 2018-8-14 16:32:41 | 显示全部楼层
志艺风云 发表于 2018-8-14 16:10
感谢大佬,这就是我想要的,需然看不明白那正则

这样不就行了?
If StringRegExp($Combo4Text[$i], '^$|^SELECT\h+\V+') Then
 楼主| 发表于 2018-8-14 17:13:51 | 显示全部楼层
afan 发表于 2018-8-14 16:32
这样不就行了?

不行啊,下面这也假了
$Combo4Text[2] = "SELECT 任意字符 FROM 任意字符"
发表于 2018-8-14 17:52:21 | 显示全部楼层
志艺风云 发表于 2018-8-14 17:13
不行啊,下面这也假了
$Combo4Text[2] = "SELECT 任意字符 FROM 任意字符"

怎么可能?我测试都正常
 楼主| 发表于 2018-8-15 10:50:42 | 显示全部楼层
本帖最后由 志艺风云 于 2018-8-15 10:56 编辑
afan 发表于 2018-8-14 17:52
怎么可能?我测试都正常

喔,不好意思,那个是对的,我试时用了小写字母,是我复制错了。但你这个没有分大小写,且在你的 正则助手 测试,只能试一行数据,所以正则是以为错的。

请教后面的 \h+\V+ 改成.*有什么差别啊

Local $Combo4Text[7]
$Combo4Text[0] = "" ;真
$Combo4Text[1] = "select * FROM 任意字符" ;真
$Combo4Text[2] = "sELECT 任意字符 FROM 任意字符" ;真
$Combo4Text[3] = "SELECT 任意字符 FROM 任意字符 into 任意字符" ;真
$Combo4Text[4] = "select 任意字符 INTO 任意字符 from 任意字符" ;假
$Combo4Text[5] = "INSERT INTO 任意字符" ;假
$Combo4Text[6] = "任意字符" ;假

For $i = 0 To 6
        ;If $Combo4Text[$i] = "" Or StringRegExp($Combo4Text[$i], "(?mi)^SELECT(?:(?!into.*?from).)+$") Then
        If StringRegExp($Combo4Text[$i], "^$|^SELECT\h+\V+") Then
                MsgBox(0, "测试[" & $i & "]应为:" & ($i < 4 ? "真" : "假"), "字符串:" & $Combo4Text[$i] & @CRLF & "结果为:真")
        Else
                MsgBox(0, "测试[" & $i & "]应为:" & ($i < 4 ? "真" : "假"), "字符串:" & $Combo4Text[$i] & @CRLF & "结果为:假")
        EndIf
Next






发表于 2018-8-15 10:53:21 | 显示全部楼层
志艺风云 发表于 2018-8-15 10:50
喔,不好意思,那个是对的,我试时用了小写字母,是我复制错了。但你这个没有分大小写

我只根据你的测试源来,你的ok我的就都ok,你没有提到的就没有考虑
 楼主| 发表于 2018-8-15 10:59:26 | 显示全部楼层
afan 发表于 2018-8-15 10:53
我只根据你的测试源来,你的ok我的就都ok,你没有提到的就没有考虑

回复的飞快,我发完发现没说完又改了下。
发表于 2018-8-15 11:06:43 | 显示全部楼层
志艺风云 发表于 2018-8-15 10:59
回复的飞快,我发完发现没说完又改了下。

If StringRegExp($Combo4Text[$i], "^$|(?i)^SELECT(?:(?!into).)*FROM") Then
发表于 2018-8-15 11:09:03 | 显示全部楼层
志艺风云 发表于 2018-8-15 10:50
喔,不好意思,那个是对的,我试时用了小写字母,是我复制错了。但你这个没有分大小写,且在你的 正则助 ...

在你这没什么差别,那是强制有一个空格且有一个以上同行字符
发表于 2018-8-15 15:34:44 | 显示全部楼层
学习学习正则
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-23 23:53 , Processed in 0.078633 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表