大家好,这段文本怎么用正则表达式处理啊,没整过去

对呀,你自己不都说了嘛,?代表前面符号出现0或1次,而你第三行中没有#,你开始的代码却要匹配一次#,那必然没有第三行了,加?后有没有#都会去匹配


QUOTE:
原帖由 zhouhaiming 于 2007-9-8 13:32 发表
朋友?不是表示它前面的字符重复0次或1次吗?不理解,哪位热心的朋友能解释一下吗?天天盼着呢,急等求解!这几种解决方案都解释解释!先谢谢了

?表示尽可能少的匹配
你最好多看看正则匹配哪一章
你认真看了,绝对不会有上面的问题
这样也可以

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w
use strict;

while(<>){
        s/#.*//;
if ($_ ne "\n"){
   print $_;
}
}

open (FH,"01.txt");
while(<FH>){
s/\#.*//g;
s/^\s+//;
print $_;
}
close FH;
不错,借用正则,这样就好了.
sed 's/#.*//'


QUOTE:
原帖由 zhouhaiming 于 2007-9-7 18:33 发表
我试了
$_=~s/#.*//g;
也好用
不加g也好用啊
$_=~s/#.*//;也好用,迷糊了。我学的太浅了

$_=~s/\#.*//g;
不理解,$_=~s/(.+)#(.*)/$1/;也没理解,哪位热心的网友帮忙解释一下吧!!真不好理解

解释:
1 - 在默认的贪婪匹配模式下, .*会一直匹配到行尾, 所以此时无g也无妨.

2 - $_ =~ s/(.+)#(.*)/$1/;  
匹配包含注释的"整行", 然后把该行替换为匹配到的注释以前的部分.
也是一种思路:>


不知道这样清楚了没????
个人认为

# 并不属于模式匹配下可以解析的特殊元字符,所以加不加\没有关系

? 表示匹配0或一个

* 表示匹配0,1 或多个


.*  关于 .*?   我想区别是在匹配的多少吧,?限制了*进行匹配的范围(这个不是很确定)


QUOTE:
原帖由 Lonki 于 2007-9-9 16:38 发表




解释:
1 - 在默认的贪婪匹配模式下, .*会一直匹配到行尾, 所以此时无g也无妨.

2 - $_ =~ s/(.+)#(.*)/$1/;  
匹配包含注释的"整行", 然后把该行替换为匹配到的注释以前的部分.
也是一种思路:>
...

#(.*)那后面没注释的怎么办啊?有注释的我理解了,一行中后面没注释的呢?


QUOTE:
原帖由 hfmouse 于 2007-9-9 18:05 发表
个人认为

# 并不属于模式匹配下可以解析的特殊元字符,所以加不加\没有关系

? 表示匹配0或一个

* 表示匹配0,1 或多个


.*  关于 .*?   我想区别是在匹配的多少吧,?限制了*进行匹配的范围(这个不 ...

我也觉得#前的那个反斜杠是多余的,容易造成误解!
我觉得用模块就行了。
Config::IniFiles 就挺好用。