找回密码
 加入
搜索
查看: 11070|回复: 21

[效率算法] 【已解决】正则表达式相关问题

 火.. [复制链接]
发表于 2012-12-3 13:32:11 | 显示全部楼层 |阅读模式
本帖最后由 35888894 于 2012-12-4 14:17 编辑

求助,字符串“....asd>title=234<1223>编辑<duwhuierhuhdysferij>title=123<asuhudubugadu>title=12a<....”
我想要用一个正则提取“编辑”后面所有的title=xxx,这个正则应该如何去写?谢谢
 楼主| 发表于 2012-12-3 13:40:35 | 显示全部楼层
思路 ".*?" 是尽可能的少匹配 ".+" 是尽可能的多匹配,但是我想要不添加任何的主观因素,将 "编辑"后面的"title=xxx"全部提取出来是在想不通如何通过一个表达式实现
发表于 2012-12-3 17:07:43 | 显示全部楼层
本帖最后由 qq362817567 于 2012-12-3 18:03 编辑

直接貌似很难实现,曲线就简单了。
#include <array.au3>
$source="....asd>title=234<1223>编辑<duwhuierhuhdysferij>title=123<asuhudubugadu>title=12a<...."
$source=StringRegExpReplace($source,"[\s\S]+编辑","")
$source=StringRegExp($source,"title=[^<]+",3)
_ArrayDisplay($source)
发表于 2012-12-3 17:22:54 | 显示全部楼层
title=\w+
这个把编辑前面的也匹配了!
发表于 2012-12-3 17:31:46 | 显示全部楼层
#include <Array.au3>
Local $str='“....asd>title=234<1223>编辑<duwhuierhuhdysferij>title=123<asuhudubugadu>title=12a<....”'
Local $strin=StringInStr($str,"编辑")
Local $strmid=StringMid($str,$strin)
Local $strarray=StringRegExp($strmid,'title=\w+',3)
If Not @error Then _ArrayDisplay($strarray,'Debug~~~')
可以这样实现
发表于 2012-12-3 20:26:06 | 显示全部楼层

表达式

本帖最后由 lixiaolong 于 2012-12-3 20:48 编辑

回复 1# 35888894

#include <Array.au3>

$Str = '....asd>title=234<1223>编辑<duwhuierhuhdysferij>title=123<asuhudubugadu>title=12a<....'

Local $Test = StringRegExp($Str, '(title\=\w+)(?!.*编辑)', 3, 1)

_ArrayDisplay($Test, UBound($Test))


表达式开头加个 (?s) 支持多行.
\w+ 可以改成你需要的.

评分

参与人数 1金钱 +10 收起 理由
35888894 + 10 感谢!

查看全部评分

发表于 2012-12-3 21:58:25 | 显示全部楼层
回复 6# lixiaolong

学习了!正则的贪婪性。
发表于 2012-12-3 22:41:53 | 显示全部楼层
回复 6# lixiaolong


    这个如果源字符串没有“编辑”字符也能匹配到,那就算出错了……

我只想到分段匹配的方法,一次性捕获倒没研究过

评分

参与人数 1贡献 +2 收起 理由
lixiaolong + 2 谢谢提醒!

查看全部评分

发表于 2012-12-3 22:52:18 | 显示全部楼层
非一次正则搞定…
#include <Array.au3>
Local $Str = '....asd>title=234<1223>编辑<duwhuierhuhdysferij>title=123<asuhudubugadu>title=12a<....'
StringRegExp($Str, '编辑', 1)        ;这里可以用StringInStr,考虑到通用性还是使用正则
If @error Then Exit
Local $aSR = StringRegExp($Str, '>([^<]*)', 3, @extended)
_ArrayDisplay($aSR, UBound($aSR))

评分

参与人数 1金钱 +10 收起 理由
35888894 + 10 感谢!

查看全部评分

 楼主| 发表于 2012-12-4 13:57:26 | 显示全部楼层
回复 6# lixiaolong
请教一下“(?!.*编辑)”的用法 (?!)是不等于 (?!.*编辑)的意思是不匹配前面为任意字符,截止“编辑”后面的数据进行捕获title=XXX 同理,我如果捕获“编辑”前面的title这个方法为什么就失效了呢(title\=[^<>]+)(?!编辑.*)
 楼主| 发表于 2012-12-4 14:07:53 | 显示全部楼层
搞定了,原来是要这样。。(?=.*编辑)(title=\w+)
 楼主| 发表于 2012-12-4 14:08:47 | 显示全部楼层
总结:匹配标识符前面的要用?= 匹配标识符后面的要用?!
发表于 2012-12-4 14:16:14 | 显示全部楼层
总结:匹配标识符前面的要用?= 匹配标识符后面的要用?!
35888894 发表于 2012-12-4 14:08



    不知道你到底要取到什么字符,一下要取编辑后面的所有匹配,一下又要取编辑前面的……
而且貌似你的总结也是错误的
 楼主| 发表于 2012-12-4 14:16:32 | 显示全部楼层
....asd>title=2324<1xhadj评审2d>title=23zzsd4<123>编辑<duwhuierhuhdysferij>title=123<asuhudubugadu>title=12a<....

(?!.*评审)(?=.*编辑)(title=\w+)
匹配结果为:title=23zzsd4
发表于 2012-12-4 14:37:03 | 显示全部楼层
....asd>title=2324title=23zzsd4编辑title=123title=12a
35888894 发表于 2012-12-4 14:16



    完全不是一楼的问题……
评审.*?(title=[^<]+).*?编辑
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-22 17:08 , Processed in 0.084469 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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