boyhong 发表于 2011-3-29 12:00:47

[已解决]正则提取第一个\之前的段

本帖最后由 boyhong 于 2011-3-29 12:36 编辑

如下:没有问题,可以正常提取: "\\ " 与第一个"\ "之间的字符串。


Local $Str = '\\192.168.8.30\log'
Local $Test = StringRegExpReplace($str, '\A\\\\(.*)\\.*', '$1')
MsgBox(0, '替换结果', $Test)

$Test = StringRegExp($str, '\A\\\\(.*)\\', 3)
MsgBox(0,"",$Test)


但是:如下,我无法在正则中指定第一个"\ "就结束匹配。

Local $Str = '\\192.168.8.30\log\111\test\\test\tet'
Local $Test = StringRegExpReplace($str, '\A\\\\(.*)\\.*', '$1')
MsgBox(0, '替换结果', $Test)

$Test = StringRegExp($str, '\A\\\\(.*)\\', 3)
MsgBox(0,"",$Test)


希望大家多多指点。

afan 发表于 2011-3-29 12:15:12

Local $Str = '\\192.168.8.30\log\111\test\\test\tet'
Local $Test = StringRegExpReplace($str, '\\\\([^\\]+).*', '$1')
MsgBox(0, '替换结果', $Test)

$Test = StringRegExp($str, '^\\\\([^\\]+)', 1)
MsgBox(0,"",$Test)

love5173 发表于 2011-3-29 12:36:18

回复 1# boyhong
根据正则的贪婪特性,匹配时会最长字符匹配,为了避免此类情况,运用正则的懒惰特性?
最好是自己看下帮助,很简单在+或者*后面加一个?即可
如果觉得我的话很有道理 请给10个金币,嘿嘿

boyhong 发表于 2011-3-29 12:38:27

回复boyhong
根据正则的贪婪特性,匹配时会最长字符匹配,为了避免此类情况,运用正则的懒惰特性?
最 ...
love5173 发表于 2011-3-29 12:36 http://www.autoitx.com/images/common/back.gif


    我已尝试了一下,但取出来包括了\\本身,比如: \\\\.*?\\

love5173 发表于 2011-3-29 12:38:59

本帖最后由 love5173 于 2011-3-29 12:53 编辑

Local $Str = '\\192.168.8.30\log\111\test\\test\tet'
Local $Test = StringRegExpReplace($str, '\A\\\\(.*?)\\.*', '$1')
MsgBox(0, '替换结果', $Test)

$Test = StringRegExp($str, '\A\\\\(.*?)\\', 3)
MsgBox(0,"",$Test)
只是给你稍微修改了一下,试试啊


测试结果是没问题的?是因为输入法的问题错误,下面的是修改完毕的
我只是想表达一个贪婪与懒惰的意思,没有想到你直接要完整的代码,我的错误,对不起

boyhong 发表于 2011-3-29 12:40:02

但这不是我想要的,苦苦想了好久时间,无解,才来发的贴,正则我掌握得太浅了。。。。正在加深学习中。

感谢您的关注。

boyhong 发表于 2011-3-29 12:42:13

只是给你稍微修改了一下,试试啊
love5173 发表于 2011-3-29 12:38 http://www.autoitx.com/images/common/back.gif


    Not ok~~~but thank you for help me~

love5173 发表于 2011-3-29 12:43:45

回复 6# boyhong
或许你没明白我的意思,但是加油

love5173 发表于 2011-3-29 12:50:42

Local $Str = '\\192.168.8.30\log\111\test\test\test'


Local $Test = StringRegExpReplace($str, '\\\\(.*?)\\.*', '$1')


MsgBox(0, '替换结果', $Test)
这个是我测试完毕的
相信你自己,学会贪婪与懒惰的运用

easefull 发表于 2011-3-29 21:22:52

做习题了#include <Array.au3>
Local $sText    = "\\192.168.0.1\\Share\\\\1\\\2\3\4"
Local $sRegExp= '(?<=^\\\\)[^\\]+'
Local $asResult = StringRegExp($sText, $sRegExp, 3)
If @error Then
        MsgBox(4096, "", "返回结果非数组" &@LF& $asResult)
Else
        For $i = 0 To UBound($asResult) - 1 Step 1
                If StringLen($asResult[$i]) > 4094 Then
                        Local $IsCut = MsgBox(4096 + 48 + 4 + 256, "警告", "数组元素 $asResult[" & $i & "]长度超出显示界限(4094)" & @LF & "是否需要截取字符串?")
                        If $IsCut = 6 Then $asResult[$i] = StringLeft($asResult[$i], 4094)
                EndIf
        Next
        _ArrayDisplay($asResult)
EndIf
$sText = StringRegExpReplace($sText, $sRegExp, 'ComputerName')
MsgBox(4096, "", $sText)留下一个问题,为什么$sRegExp= '\\\\([^\\]+).*'时,StringRegExp能只匹配第一个部分.但StringRegExpReplace却会替换整串字符?

lixiaolong 发表于 2011-11-27 04:36:08

回复 1# boyhong

如果获取指定形式【192.168.8.30】可以这样写.
(?:\d+\.){3}\d{2}
页: [1]
查看完整版本: [已解决]正则提取第一个\之前的段