找回密码
 加入
搜索
查看: 4548|回复: 10

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

  [复制链接]
发表于 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[0])


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

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[0])


希望大家多多指点。
发表于 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[0])

评分

参与人数 1贡献 +5 收起 理由
boyhong + 5 感谢您。感觉自己又上升了一步。

查看全部评分

发表于 2011-3-29 12:36:18 | 显示全部楼层
回复 1# boyhong
根据正则的贪婪特性,匹配时会最长字符匹配,为了避免此类情况,运用正则的懒惰特性?
最好是自己看下帮助,很简单在+或者*后面加一个?即可
如果觉得我的话很有道理 请给10个金币,嘿嘿
 楼主| 发表于 2011-3-29 12:38:27 | 显示全部楼层
回复  boyhong
根据正则的贪婪特性,匹配时会最长字符匹配,为了避免此类情况,运用正则的懒惰特性?
最 ...
love5173 发表于 2011-3-29 12:36



    我已尝试了一下,但取出来包括了\\本身,比如: \\\\.*?\\
发表于 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[0])

只是给你稍微修改了一下,试试啊


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

评分

参与人数 1金钱 +10 收起 理由
boyhong + 10 虽然运行结果不是我要的结果,但感谢您的热 ...

查看全部评分

 楼主| 发表于 2011-3-29 12:40:02 | 显示全部楼层
但这不是我想要的,苦苦想了好久时间,无解,才来发的贴,正则我掌握得太浅了。。。。正在加深学习中。

感谢您的关注。
 楼主| 发表于 2011-3-29 12:42:13 | 显示全部楼层
只是给你稍微修改了一下,试试啊
love5173 发表于 2011-3-29 12:38



    Not ok~~~but thank you for help me~
发表于 2011-3-29 12:43:45 | 显示全部楼层
回复 6# boyhong
或许你没明白我的意思,但是加油
发表于 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)

这个是我测试完毕的
相信你自己,学会贪婪与懒惰的运用
发表于 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却会替换整串字符?
发表于 2011-11-27 04:36:08 | 显示全部楼层
回复 1# boyhong

如果获取指定形式【192.168.8.30】可以这样写.
(?:\d+\.){3}\d{2}
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-1 07:39 , Processed in 0.082801 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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