正则表达式匹配行首的问题
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
正则表达式匹配行首的问题
要想匹配位于行首的 cat
显然要用 ^cat
现在需要匹配所有不位于行首的 cat 应该用什么表达式?可以用 extended RE.
显然要用 ^cat
现在需要匹配所有不位于行首的 cat 应该用什么表达式?可以用 extended RE.
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: 正则表达式匹配行首的问题
不位于行首,则前面至少有一个字符,所以可以用“.cat”
代码: 全选
grep '.cat'
上次由 aerofox 在 2011-04-30 22:04,总共编辑 1 次。
- remeber
- 论坛版主
- 帖子: 13030
- 注册时间: 2009-01-06 15:18
- 来自: 人间
Re: 正则表达式匹配行首的问题
-v 反选
“有一种被人抛诸脑后的过去,包含一些不该遗忘的点点滴滴。欢笑之余,我将故旧拾起,才刹见自己的薄情。人世间似乎存在着某种公平,每个人都曾被抛掷在他人的遗忘中;而今你所有哽咽难宣的话语,也正是你曾为人所期盼,却永远听不见的字句。” —赫曼 赫塞
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
要是能用 -v 的话就好了。
我就是想问有没有正则表达式能描述这个意思。
因为在匹配一种語法文件的时候,有一个关键字不能在行首,所以要专门去掉这种情况。
如果能的话,脚本就会写的比较容易。不然就得用非常迂回的手法。渲染这种語法很常用,所以我想写的清楚些。
我就是想问有没有正则表达式能描述这个意思。
因为在匹配一种語法文件的时候,有一个关键字不能在行首,所以要专门去掉这种情况。
如果能的话,脚本就会写的比较容易。不然就得用非常迂回的手法。渲染这种語法很常用,所以我想写的清楚些。
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
我看三楼的方法行。用用试试。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 正则表达式匹配行首的问题
真的不行:pangding 写了:我看三楼的方法行。用用试试。
代码: 全选
kose5@kose5-Aspire-4552:~$ cat a
cat dsf dsdf
df cat fgfg cat
(#为了显示空格) cat
12cat
cat nm cat
cat bncat
ccat
asd dsf
kose5@kose5-Aspire-4552:~$ grep '.cat' a
df cat fgfg cat
(#为了显示空格) cat
12cat
cat nm cat
cat bncat
ccat
上次由 fnan 在 2011-05-01 19:15,总共编辑 2 次。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 正则表达式匹配行首的问题
怎么不早说不要行首符号,不能用awk?:pangding 写了:要是能用 -v 的话就好了。
我就是想问有没有正则表达式能描述这个意思。
因为在匹配一种語法文件的时候,有一个关键字不能在行首,所以要专门去掉这种情况。
如果能的话,脚本就会写的比较容易。不然就得用非常迂回的手法。渲染这种語法很常用,所以我想写的清楚些。
kose5@kose5-Aspire-4552:~$ cat a
cat dsf dsdf
df cat fgfg cat
(#为了显示空格) cat
12cat
cat nm cat
cat bncat
ccat
asd dsf
kose5@kose5-Aspire-4552:~$ awk -F"cat" '{if ($1 != "" && NF > 1) print $0}' a
df cat fgfg cat
(#为了显示空格) cat
12cat
ccat
kose5@kose5-Aspire-4552:~$
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
谢谢 fnan 的耐心解答。
不过 .cat 其实就差不多了。
我后来发现把那个关键词看成 " cat\b" 基本就行。(\b 是 perl 里的 word boundary,我用的不是 perl 但也支持类似的表达)。就是 cat 是一个完整的单词,不能是 catxxx 也不能是 xxxcat。
现在没发现什么明显的 bug,这么写有什么问题?
不过 .cat 其实就差不多了。
我后来发现把那个关键词看成 " cat\b" 基本就行。(\b 是 perl 里的 word boundary,我用的不是 perl 但也支持类似的表达)。就是 cat 是一个完整的单词,不能是 catxxx 也不能是 xxxcat。
现在没发现什么明显的 bug,这么写有什么问题?
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
用什么都行 awk 也可以。
像
cat xxxx cat xxxx
这种行也要,因为它含一个合法的 cat。
像
cat xxxx cat xxxx
这种行也要,因为它含一个合法的 cat。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 正则表达式匹配行首的问题
问题不是怎样写,而是才发现猜问题比脚本本身更有挑战性。pangding 写了:谢谢 fnan 的耐心解答。
不过 .cat 其实就差不多了。
我后来发现把那个关键词看成 " cat\b" 基本就行。(\b 是 perl 里的 word boundary,我用的不是 perl 但也支持类似的表达)。就是 cat 是一个完整的单词,不能是 catxxx 也不能是 xxxcat。
现在没发现什么明显的 bug,这么写有什么问题?
这么说完整问题是: 有单词cat,不是单独在行首?还是根本与行首无关,有单词cat就行?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
看来我一开始说的不清楚。
是要找所有的 单词 cat,但是如果这个单词出现在行首,则不认为它是要找的。
像我举例的
cat xxxx cat xxxx
其中第一个就不合法,但第二个是对的。
是要找所有的 单词 cat,但是如果这个单词出现在行首,则不认为它是要找的。
像我举例的
cat xxxx cat xxxx
其中第一个就不合法,但第二个是对的。
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
只不过这里的 cat 要是单词,就是不能是 catxxx 或者 xxxcat 或者 xxxcatxxx。
其实在三楼提示了点以后,我已经能用 perl 描述这个表达式了。
在 vi 里应该可以用类似
/.\zs\<cat\>/
的表达式表达。
\zs 用来描述匹配从这开始。即前面的 . 只是为了向后检查。有点类似 perl 里的 (?<=pattern),表示这个匹配前面至少有一个字符,因而不在行首。
\< 和 \> 在 vi 里表示单词边界。
不过大家有兴趣也可以试试别的方法。不过不是所有的正则引擎的这么给力的。不一定能描述出来。
其实在三楼提示了点以后,我已经能用 perl 描述这个表达式了。
在 vi 里应该可以用类似
/.\zs\<cat\>/
的表达式表达。
\zs 用来描述匹配从这开始。即前面的 . 只是为了向后检查。有点类似 perl 里的 (?<=pattern),表示这个匹配前面至少有一个字符,因而不在行首。
\< 和 \> 在 vi 里表示单词边界。
不过大家有兴趣也可以试试别的方法。不过不是所有的正则引擎的这么给力的。不一定能描述出来。
上次由 pangding 在 2011-05-03 13:44,总共编辑 2 次。
-
- 帖子: 48
- 注册时间: 2011-03-01 23:14
Re: 正则表达式匹配行首的问题
现在可以放宽条件,用 -v 或者 管道 都可以。awk 呀 sed 都可以用。
- lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 正则表达式匹配行首的问题
pangding 写了:现在可以放宽条件,用 -v 或者 管道 都可以。awk 呀 sed 都可以用。
代码: 全选
grep -oP '(?!^)\bcat\b'