kk_lee69
发表于 2015-10-29 11:55:26
回复 15# haijie1223
我理解 我只是因為不懂正則所以想要多了解一下語法上的差異 單就語法來說
用不用 [] 將;框住 是沒有關係的嚕
haijie1223
发表于 2015-10-29 16:51:18
回复 16# kk_lee69
我的理解是这样的,不知道对不对,这个Afan说话比较有权威性。
haijie1223
发表于 2015-10-30 08:11:08
可能我一开始理解错误了,楼主可能是这个意思。(?m)^[^;]+;?以上的正则是请教Afan所得,希望能够解决楼主的问题。
kk_lee69
发表于 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 的用途是甚麼呢
haijie1223
发表于 2015-10-30 13:14:11
回复 19# kk_lee69
真搞不懂你,你是要替换还是要匹配啊?最后再给你回一帖吧,自己多琢磨:(?m)^[^;]+
kk_lee69
发表于 2015-10-30 14:12:22
回复 20# haijie1223
SORRY 我誤解意思了@@那個是替換的
原本的那個 (?m)^[^;]+;?可以 是我想要的.........感謝!!
kk_lee69
发表于 2015-10-30 14:13:42
回复 20# haijie1223
SORRY 我誤解意思了@@那個是替換的
原本的那個 (?m)^[^;]+;?可以 是我想要的.........感謝!!
原來替換的語法 跟 匹配的不一樣ㄟ@@
kk_lee69
发表于 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 的時候 使用 工具測試 會出現 沒有找到可以替換的內容
afan
发表于 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 http://www.autoitx.com/images/common/back.gif
你这次说的比一楼的逻辑性强点,也清楚点。之前在3#问你的疑问你也是当我没问…
;(.*)如果你是用替换方式,不管工具提示什么,它都应该正确的返回 1,2,3 ,因为没匹配会返回全部。当然,你的小括号多余, ;.* 即可。
题外话:一个匹配表达式即可获得你需要的两个结果,为何非要分两次分别替换获得?
kk_lee69
发表于 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
kk_lee69
发表于 2015-10-30 15:34:49
你这次说的比一楼的逻辑性强点,也清楚点。之前在3#问你的疑问你也是当我没问…
;(.*)如果你是 ...
afan 发表于 2015-10-30 14:44 http://www.autoitx.com/images/common/back.gif
一个匹配表达式即可获得你需要的两个结果
能請教一下 這個 匹配表達式嗎?? 順便多學點正則
afan
发表于 2015-10-30 15:37:26
本帖最后由 afan 于 2015-10-30 15:41 编辑
一个匹配表达式即可获得你需要的两个结果
能請教一下 這個 匹配表達式嗎?? 順便多學點正則
kk_lee69 发表于 2015-10-30 15:34 http://www.autoitx.com/images/common/back.gif
^([^;\v]*)(?:;?(\V*))
顺便给你做了6种可能性测试 结果一目了然 就不用我说什么了Local $aStr = ['', _
';', _
'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 & "'" & @LF & "'" & $aSR & "'")
Next
kk_lee69
发表于 2015-10-30 15:53:51
回复 27# afan
感謝 版主 太強了果然每次都是返回兩種這樣子的方法 好像更簡潔些
我再研究看看謝啦
afan
发表于 2015-10-30 15:57:26
回复 28# kk_lee69
上面的表达式是可用于多行测试的,前面加(?m)即可。如果都是单行,还可以简单一点
^([^;]*)(?:;?(.*))
afan
发表于 2015-10-30 16:19:59
网速慢到可以… 编辑都不行,以下即可,便于理解
^([^;]*);?(.*)