志艺风云 发表于 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 任意字符"的正则结果为真

afan 发表于 2018-8-14 15:14:14

简单的问题被你描述成这样也是强~
既然描述不清,最基本的可运行脚本也没有

志艺风云 发表于 2018-8-14 16:10:00

afan 发表于 2018-8-14 15:14
简单的问题被你描述成这样也是强~
既然描述不清,最基本的可运行脚本也没有

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

Local $Combo4Text
$Combo4Text = ""
$Combo4Text = "SELECT * FROM 任意字符"
$Combo4Text = "SELECT 任意字符 FROM 任意字符"
$Combo4Text = "SELECT 任意字符 FROM 任意字符 INTO 任意字符"
$Combo4Text = "select 任意字符 INTO 任意字符 from 任意字符"
$Combo4Text = "INSERT INTO 任意字符"
$Combo4Text = "任意字符"

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

afan 发表于 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 = "SELECT 任意字符 FROM 任意字符"

afan 发表于 2018-8-14 17:52:21

志艺风云 发表于 2018-8-14 17:13
不行啊,下面这也假了
$Combo4Text = "SELECT 任意字符 FROM 任意字符"

怎么可能?我测试都正常

志艺风云 发表于 2018-8-15 10:50:42

本帖最后由 志艺风云 于 2018-8-15 10:56 编辑

afan 发表于 2018-8-14 17:52
怎么可能?我测试都正常
喔,不好意思,那个是对的,我试时用了小写字母,是我复制错了。但你这个没有分大小写,且在你的 正则助手 测试,只能试一行数据,所以正则是以为错的。

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

Local $Combo4Text
$Combo4Text = "" ;真
$Combo4Text = "select * FROM 任意字符" ;真
$Combo4Text = "sELECT 任意字符 FROM 任意字符" ;真
$Combo4Text = "SELECT 任意字符 FROM 任意字符 into 任意字符" ;真
$Combo4Text = "select 任意字符 INTO 任意字符 from 任意字符" ;假
$Combo4Text = "INSERT INTO 任意字符" ;假
$Combo4Text = "任意字符" ;假

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






afan 发表于 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,你没有提到的就没有考虑

回复的飞快,我发完发现没说完又改了下。

afan 发表于 2018-8-15 11:06:43

志艺风云 发表于 2018-8-15 10:59
回复的飞快,我发完发现没说完又改了下。

If StringRegExp($Combo4Text[$i], "^$|(?i)^SELECT(?:(?!into).)*FROM") Then

afan 发表于 2018-8-15 11:09:03

志艺风云 发表于 2018-8-15 10:50
喔,不好意思,那个是对的,我试时用了小写字母,是我复制错了。但你这个没有分大小写,且在你的 正则助 ...

在你这没什么差别,那是强制有一个空格且有一个以上同行字符

破帽遮颜 发表于 2018-8-15 15:34:44

学习学习正则
页: [1]
查看完整版本: [已解决]问个正则,并优化一下。