找回密码
 加入
搜索
楼主: kk_lee69

[AU3基础] 正则问题 麻烦懂正则的帮忙看看 用正则拆字符串,取;前面与;后面[已解决]

 火.. [复制链接]
 楼主| 发表于 2015-10-29 11:55:26 | 显示全部楼层
回复 15# haijie1223

我理解 我只是因為不懂正則  所以想要多了解一下  語法上的差異     單就語法來說
用不用 [] 將;框住 是沒有關係的嚕
发表于 2015-10-29 16:51:18 | 显示全部楼层
回复 16# kk_lee69


    我的理解是这样的,不知道对不对,这个Afan说话比较有权威性。
发表于 2015-10-30 08:11:08 | 显示全部楼层
可能我一开始理解错误了,楼主可能是这个意思。
(?m)^[^;]+;?
以上的正则是请教Afan所得,希望能够解决楼主的问题。
 楼主| 发表于 2015-10-30 09:45:52 | 显示全部楼层
回复 18# haijie1223
當   $A="1,2,3;KKK"  匹配的結果是  1,2,3;
當   $A="1,2,3;"  匹配的結果是  1,2,3;
當   $A="1,2,3"  匹配的結果是  1,2,3

我的希望是 匹配的結果都是  1,2,3

另外 請教一下 這個正則  可以這樣翻譯嗎??
(?m)^[^;]+;?
(?m) 設定 Multiline: 因為默認 Multiline 是關閉的 而 Multiline 必須要搭配 ^ 與 $ 匹配.
^[^;]+  第一個 ^ 表示 匹配開頭 [^;] 表示不匹配以分號開頭的  +表示 至少出現一次
;?  表示 接著 ; 可以出現0 或者 一次

是這樣的意思嗎??
Multiline 的用途是甚麼呢
发表于 2015-10-30 13:14:11 | 显示全部楼层
回复 19# kk_lee69


     真搞不懂你,你是要替换还是要匹配啊?最后再给你回一帖吧,自己多琢磨:
(?m)^[^;]+
 楼主| 发表于 2015-10-30 14:12:22 | 显示全部楼层
回复 20# haijie1223

SORRY 我誤解意思了@@  那個是替換的

原本的那個 (?m)^[^;]+;?  可以 是我想要的.........感謝!!
 楼主| 发表于 2015-10-30 14:13:42 | 显示全部楼层
回复 20# haijie1223

SORRY 我誤解意思了@@  那個是替換的

原本的那個 (?m)^[^;]+;?  可以 是我想要的.........感謝!!
   
原來替換的語法 跟 匹配的不一樣ㄟ@@
 楼主| 发表于 2015-10-30 14:26:26 | 显示全部楼层
本帖最后由 kk_lee69 于 2015-10-30 14:33 编辑

回复 18# haijie1223

版主  是我誤解了 不好意思  (?m)^[^;]+;? 這個的確是我要的  用取代的方式  取;後面

另外一個需求 就是  一樣 要用 取代的方式  取 ;前面 如果有;號就取前面 沒;號 就需要返回字串本身
譬如:1,2,3;K,K  與 1,2,3;  與  1,2,3  取代後的字串都是 1,2,3

我用 ;(.*)  這樣  當 1,2,3 的時候 使用 工具測試 會出現 沒有找到可以替換的內容
发表于 2015-10-30 14:44:27 | 显示全部楼层
本帖最后由 afan 于 2015-10-30 14:47 编辑
... 另外一個需求 就是  一樣 要用 取代的方式  取 ;前面 如果有;號就取前面 沒;號 就需要返回字串本身
譬如:1,2,3;K,K  與 1,2,3;  與  1,2,3  取代後的字串都是 1,2,3
...
kk_lee69 发表于 2015-10-30 14:26



    你这次说的比一楼的逻辑性强点,也清楚点。之前在3#问你的疑问你也是当我没问…
;(.*)  如果你是用替换方式,不管工具提示什么,它都应该正确的返回 1,2,3 ,因为没匹配会返回全部。当然,你的小括号多余, ;.* 即可。

题外话:一个匹配表达式即可获得你需要的两个结果,为何非要分两次分别替换获得?
 楼主| 发表于 2015-10-30 15:31:24 | 显示全部楼层
本帖最后由 kk_lee69 于 2015-10-30 15:33 编辑

回复 24# afan

目的是 預設一個全域變數字串   例如 $A   以分號隔開  各自用途不同 ,因此返回數組對我來說不方便(應該說自己習慣問題)

當要用前面的部分 希望 直接獲取 前面段 不含分號  , 當要用後面的時候 直接取後面使用

請參考 程式 示意.....

$A="1,2,3;a,b,c"


;经过计算的 变量 $ABC 与 变量 $DEF  可能会在其他的地方 再变成  
$A=$DEF&";"&$ABC


Func F1()

$ARRAY1=StringSplit(StringRegExpReplace($A,"(?m)^[^;]+;?",""),",",2)

For $I=0 TO UBound($ARRAY1)-1 Step 1
        
;经过计算 可能会得到 新的        变量 $ABC
Next


EndFunc


Func F2()

$ARRAY2=StringSplit(StringRegExpReplace($A,";(.*)",""),",",2)

For $I=0 TO UBound($ARRAY2)-1 Step 1

;经过计算 可能会得到 新的        变量 $DEF
        
Next


EndFunc
 楼主| 发表于 2015-10-30 15:34:49 | 显示全部楼层
你这次说的比一楼的逻辑性强点,也清楚点。之前在3#问你的疑问你也是当我没问…
;(.*)  如果你是 ...
afan 发表于 2015-10-30 14:44


一个匹配表达式即可获得你需要的两个结果

能請教一下 這個 匹配表達式嗎?? 順便多學點正則
发表于 2015-10-30 15:37:26 | 显示全部楼层
本帖最后由 afan 于 2015-10-30 15:41 编辑
一个匹配表达式即可获得你需要的两个结果

能請教一下 這個 匹配表達式嗎?? 順便多學點正則
kk_lee69 发表于 2015-10-30 15:34



    ^([^;\v]*)(?:;?(\V*))
    顺便给你做了6种可能性测试 结果一目了然 就不用我说什么了
Local $aStr[6] = ['', _
                ';', _
                '1,2,3;A,b,C', _
                '1,2,3A,b,C', _
                '1,2,3A,b,C;', _
                ';1,2,3A,b,C']
Local $aSR, $i
For $i = 0 To 5
        $aSR = StringRegExp($aStr[$i], '^([^;\v]*)(?:;?(\V*))', 1)
        MsgBox(0, "'" & $aStr[$i] & "'", "'" & $aSR[0] & "'" & @LF & "'" & $aSR[1] & "'")
Next
 楼主| 发表于 2015-10-30 15:53:51 | 显示全部楼层
回复 27# afan

感謝 版主 太強了  果然每次都是返回兩種  這樣子的方法 好像更簡潔些

我再研究看看  謝啦
发表于 2015-10-30 15:57:26 | 显示全部楼层
回复 28# kk_lee69


    上面的表达式是可用于多行测试的,前面加(?m)即可。如果都是单行,还可以简单一点
^([^;]*)(?:;?(.*))
发表于 2015-10-30 16:19:59 | 显示全部楼层
网速慢到可以… 编辑都不行,以下即可,便于理解
^([^;]*);?(.*)

评分

参与人数 1金钱 +5 收起 理由
haijie1223 + 5 Afan一出手果然不同凡响,简单明了。

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 22:17 , Processed in 0.071233 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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