newuser 发表于 2011-6-22 11:02:04

[已解决]正则:如何删除某特定行?如何匹配出文本中某特定段?

本帖最后由 newuser 于 2011-6-23 15:07 编辑

Local$str="this is a apple."&@CRLF& _ ;注意多行字符串的定义不要少了@crlf
            "this is a red red apple."&@CRLF& _
            "i love regex!"&@CRLF& _
            "ilove regular expressions?"&@CRLF&_
                        "this is a fat"&@CRLF& _
            "<very>fat</very> pig."
Local$result=StringRegExp($str,"(?ms)^i\V+",3)
_ArrayDisplay($result)
Local$result=StringRegExpReplace($str,"(?ms)^i\V+","")
;用指定空 内容替换   ((?ms)^i\V+)匹配的内容
;缺点:被替换处显示对应空行,如何实现删除指定行而不出现空白呢?希望想删除特定行那样不留空白.Local$str="this is a apple."&@CRLF& _ ;注意多行字符串的定义不要少了@crlf
            "this is a red red apple."&@CRLF& _
            "i love regex!"&@CRLF& _
            "ilove regular expressions?"&@CRLF&_
                        "this is a fat"&@CRLF& _
            "<very>fat</very> pig."
Local$result=StringRegExp($str,"(?ms)^i[\s\S]+fat",3)
_ArrayDisplay($result)如何从第一个字母i处取到第一个fat截止,而不是到第2个fat处?

3mile 发表于 2011-6-22 11:10:19

回复 1# newuser
#include <array.au3>
Local$str="this is a apple."&@CRLF& _ ;注意多行字符串的定义不要少了@crlf
            "this is a red red apple."&@CRLF& _
            "i love regex!"&@CRLF& _
            "ilove regular expressions?"&@CRLF&_
                        "this is a fat"&@CRLF& _
            "<very>fat</very> pig."
Local$result=StringRegExp($str,"(?ms)^i.*?\r\n",3)
_ArrayDisplay($result)
Local$result=StringRegExpReplace($str,"(?ms)^i.*?\r\n","")
msgbox(0,0,$result)
;~ ;用指定空 内容替换   ((?ms)^i\V+)匹配的内容
;~ ;缺点:被替换处显示对应空行,如何实现删除指定行而不出现空白呢?


Local$str="this is a apple."&@CRLF& _ ;注意多行字符串的定义不要少了@crlf
            "this is a red red apple."&@CRLF& _
            "i love regex!"&@CRLF& _
            "ilove regular expressions?"&@CRLF&_
                        "this is a fat"&@CRLF& _
            "<very>fat</very> pig."
Local$result=StringRegExp($str,"(?ms)^i.*?(?=fat)",3)
_ArrayDisplay($result)

love5173 发表于 2011-6-22 11:10:20

1、 有空白是因为有换行符没有被替换掉你可以在\V+后面跟一个\r\n,或者是在处理完毕后把两个连续的换行替换成一个!
2、根据正则的懒惰与贪婪特点,如果没有?控制符,会最长匹配,解决方法是更详细的正则表达式或者在你上面的正则里面+后面加上一个?!
以上内容仅仅给出意见,未进行代码测试,楼主自己摸索一下,印象更深刻

3mile 发表于 2011-6-22 11:14:07

如果愿意用垂直制表符匹配也可用这个:
#include <array.au3>
Local$str="this is a apple."&@CRLF& _ ;注意多行字符串的定义不要少了@crlf
            "this is a red red apple."&@CRLF& _
            "i love regex!"&@CRLF& _
            "ilove regular expressions?"&@CRLF&_
                        "this is a fat"&@CRLF& _
            "<very>fat</very> pig."
Local$result=StringRegExp($str,"(?ms)^i\V+\v+",3)
_ArrayDisplay($result)
Local$result=StringRegExpReplace($str,"(?ms)^i\V+\v+","")
msgbox(0,0,$result)

love5173 发表于 2011-6-22 11:17:31

还是3M手快啊,我不建议用用\v+ 这样会删除本来存在的空行,你觉得呢

newuser 发表于 2011-6-23 09:47:59

本帖最后由 newuser 于 2011-6-23 09:49 编辑

回复
我马虎了,没有写上+ !
5# love5173

newuser 发表于 2011-6-23 15:06:10

回复 3# love5173
谢谢!一些话惊醒糊涂人,我也一直按懒惰模式测试,但一直尝试用零宽模式解决,却忘记了零宽只是位置匹配并不匹配内容,结果第1个fat始终无法捕获,其实(?ms)^i...fat我都匹配完毕了,那么中间只要使用懒惰匹配就OK了,正如你的话一样,记忆确实深刻多了,谢谢.

newuser 发表于 2011-6-23 15:07:03

回复 5# love5173
删除文本自有 的空行:   \s\r

ainizm 发表于 2013-5-29 23:32:33

留下脚印,先转转看
页: [1]
查看完整版本: [已解决]正则:如何删除某特定行?如何匹配出文本中某特定段?