当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]另一类正则表达式的最短匹配问题
帖子发表于 : 2007-03-10 8:18 

注册: 2005-07-14 14:44
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
代码:
我用 sed 的时候,需要用到最短匹配。按照 sed 手册,针对字符串:

foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things.
              \---------------------/
              \--------------------------------------------------------/

A[^T]*T
就可以匹配
foo bar A xxx some other characters T
而非
foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 T


然而,我的麻烦在于,我希望匹配的标记,是多字符(Tag)而非单字符(T)。

请问应当写怎样的正则表达式,才能从 A 匹配到 第一个 Tag 呢?

如下图


foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things.
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

先谢了!


以上为了使用等宽字体对齐,使用了代码格式。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-03-10 10:03 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
A([^T]|T[^a]|Ta[^g])*Tag


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-03-10 11:27 

注册: 2005-07-14 14:44
帖子: 10
送出感谢: 0 次
接收感谢: 0 次
对了!

十分感谢。不过其他朋友注意,因为使用了扩展正则表达式,似应在 sed 命令行中使用 -r 选项。如下:

代码:
$ sed -r -e 'A([^T]|T[^a]|Ta[^g])*Tag' somefile


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-05-05 22:28 

注册: 2006-02-23 20:22
帖子: 76
送出感谢: 0 次
接收感谢: 0 次
代码:
echo "foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things. "| sed 's/.*A\(.*\)Tag.*Tag.*/\1/'

这样也可以取到的说


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-05-07 20:56 
头像

注册: 2006-05-19 21:42
帖子: 184
地址: NIT
送出感谢: 0 次
接收感谢: 0 次
5451vs5451 写道:
A([^T]|T[^a]|Ta[^g])*Tag

这个不能匹配Tag前面为T或Ta的,可以写作
A([^T]|T[^a]|Ta[^g])*(T|Ta)?Tag


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-05-07 21:10 
头像

注册: 2006-05-19 21:42
帖子: 184
地址: NIT
送出感谢: 0 次
接收感谢: 0 次
zanefei 写道:
代码:
echo "foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things. "| sed 's/.*A\(.*\)Tag.*Tag.*/\1/'

这样也可以取到的说

这个好像在有1个或两个以上Tag的时候结果不对


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-05-07 23:55 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
alinmn 写道:
A([^T]|T[^a]|Ta[^g])*(T|Ta)?Tag


这个不能保证最短,它可与字符串 "A TaTag Tag" 相匹配。

真要把 TTag 和 TaTag 的情况考虑进去,我怀疑是否可以构造出一个符合条件的正则表达式。这种情况下倒不如用sed进行多次处理来得简单。

代码:
sed -n '/A.*/p' | sed -n 's/Tag.*/Tag/p'


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-05-08 13:17 
头像

注册: 2006-05-19 21:42
帖子: 184
地址: NIT
送出感谢: 0 次
接收感谢: 0 次
呵呵 刚试了一下 原来的也会匹配 A TaTag Tag 因为TaT会被Ta[^g]匹配,
A([^T]|(T*a)*[^Tg]|(T*a)*T+[^Ta])*(Ta?)*Tag 不会出现这种情况,
不过还是sed多次处理简单


最后由 alinmn 编辑于 2007-05-12 14:03,总共编辑了 1 次

页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-05-10 23:36 

注册: 2006-10-20 12:35
帖子: 27
送出感谢: 0 次
接收感谢: 0 次
不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'

OVER


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-05-11 0:21 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
csbde 写道:
不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'

OVER


不知所云。
代码:
$ echo A Tag Tag Tag | sed 's/.*\(A.*T\).*/\1/g'
A Tag Tag T


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2007-05-11 13:02 

注册: 2006-10-20 12:35
帖子: 27
送出感谢: 0 次
接收感谢: 0 次
5451vs5451 写道:
csbde 写道:
不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'

OVER


不知所云。
代码:
$ echo A Tag Tag Tag | sed 's/.*\(A.*T\).*/\1/g'
A Tag Tag T


好像你的代码跟我一样吧


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2007-05-11 13:54 
头像

注册: 2006-05-19 21:42
帖子: 184
地址: NIT
送出感谢: 0 次
接收感谢: 0 次
csbde 写道:
不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'

OVER

回帖没看帖吧


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 12 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译