Chinaunix

标题: 正则表达式求解!!! [打印本页]

作者: xht314    时间: 2009-06-04 14:14
标题: 正则表达式求解!!!
在java代码中用 如下方式作为注释:

/*
*
* test
*
*/


我现在有几个文件,想通过正则表达式查找出文件中的注释部分.  自己试了下,怎么都找不出来. 在这里还请哪位朋友帮下忙. 谢谢
作者: hitsubunnu    时间: 2009-06-04 14:22

  1. while(<>){
  2.         print if(m!/\*!..m!\*/!);
  3. }
复制代码

作者: xht314    时间: 2009-06-04 14:35
谢谢 hitsubunnu

你给的代码很好用.    但是我在windows用UltraEdit工具想批量替换注释.  用这个表达式行不通.  

如果用perl来替换,将如何操作呢?  我的目录下面有很多子目录,有很多文件. 我想将所有注释都替换掉.
作者: shihao138096    时间: 2009-06-04 14:52
s/\/\*.*\n//;
s/\s*\*.*\n//;
s/(.*?)\/\*.*?\*\//$1/;
可以把原来的注释去掉,你试一下。顺便说一下,我是初学者,有些地方难免有错,欢迎指正,呵呵
作者: hitsubunnu    时间: 2009-06-04 15:00
原帖由 xht314 于 2009-6-4 14:35 发表
谢谢 hitsubunnu

你给的代码很好用.    但是我在windows用UltraEdit工具想批量替换注释.  用这个表达式行不通.  

如果用perl来替换,将如何操作呢?  我的目录下面有很多子目录,有很多文件. 我想将所有注释 ...


  1. grep -r '*' /your/path/ >log.txt
复制代码

作者: xht314    时间: 2009-06-04 15:07
/*
* Copyright 2007-2008 Sun Microsystems, Inc.  All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


package com.sun.swingset3;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
*
* @author Amy Fowler
*/
public class AboutBox extends JPanel {
    private BufferedImage bgImage;

    public AboutBox() {
        try {
            bgImage = ImageIO.read(AboutBox.class.getResource("resources/images/about.jpg"));
        } catch (Exception ex) {
        }




    }

}


这是我某个文件的内容, 我想将文件注释去掉.变成:


package com.sun.swingset3;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class AboutBox extends JPanel {
    private BufferedImage bgImage;

    public AboutBox() {
        try {
            bgImage = ImageIO.read(AboutBox.class.getResource("resources/images/about.jpg"));
        } catch (Exception ex) {
        }




    }

}








hitsubunnu朋友的    grep -r '*' /your/path/ >log.txt   是将查找的注释输入到log里的.  与我的本意不相符.     现在我应该说清楚了. 而且在我的一个目录下有很多这样的文件. 能不能写个脚本把目录下的所有文件的注释都去掉呢?

作者: shihao138096    时间: 2009-06-04 15:29
我发那个不好用么,你要做那个操作,首先要查找查找当前目录下的所有文件,然后在一个循环中使用这些查找到的文件的文件句柄,再在循环主题使用我发的三行代码就行了。
作者: xht314    时间: 2009-06-04 15:32
shihao138096 朋友, 谢谢你,我看到了你写的三个表达式.  不过我也是个新手,我以前自学过PERL.好长时间不用,淡忘了许多.  我不会写了.你能帮我写一个这样的例子吗?
作者: MMMIX    时间: 2009-06-04 16:00
原帖由 xht314 于 2009-6-4 15:07 发表
这是我某个文件的内容, 我想将文件注释去掉.

就用二楼的,把 if 换成 unless 即可。
作者: MMMIX    时间: 2009-06-04 16:01
原帖由 xht314 于 2009-6-4 14:35 发表
谢谢 hitsubunnu

你给的代码很好用.    但是我在windows用UltraEdit工具想批量替换注释.  用这个表达式行不通.  

它用了 Perl 的 ..,在 UE 里面不好使并不奇怪。
作者: shihao138096    时间: 2009-06-04 17:04
首先声明一下,关于目录的遍历,我使用的是qiguojie提供的遍历脚本,并进行了一些修改。
以下是脚本:
#!/usr/bin/perl  -w
use strict;
#定义保存搜到目录的数组
my @alldir = ();
#编写一个函数,输入一个路径,搜索这个路径下面的所有文件和目录,并把符合条件的目录保存到alldir数组中
sub pdir
{
   #获取参数
   my ($enter) = @_;
   #打开目录,如果打开失败,退出函数
   opendir (TEMP,$enter)||die return -1;
   #依次取得文件或目录名过滤,不要包含*.*格式的目录或文件,保存合法的到tempdir数组中
   my @tempdir = grep(!/.*\..*/i,readdir TEMP);
   #获得此时tempdir的数组元素个数
   my $arraysize = @tempdir;
   if ($arraysize != 0)
   {
      #循环遍历每个数组元素
      for (my $i=0;$i<$arraysize;$i++)
      {
        #组合成合法的目录元素
        $tempdir[$i] = "$enter/$tempdir[$i]";
  opendir DH, $tempdir[$i] or die "Cannot open $tempdir[$i]: $!";
  foreach my $file (readdir DH) {
   print "one file in $tempdir[$i] is $file\n";
   open FILEHANDLER,"+<$tempdir[$i]/$file";
   my @file_content;
   while(<FILEHANDLER>){
    s/\/\*.*\n//;
    s/\s*\*.*\n//;
    s/(.*?)\/\*.*?\*\//$1/;
    push @file_content,$_;
   }
   close FILEHANDLER;
   open FILEHANDLER,">$tempdir[$i]/$file";
   foreach(@file_content){
    print FILEHANDLER;
   }
   close FILEHANDLER;
  }
  closedir DH;
      }
      #将tempdir压入堆栈数组alldir
      push (@alldir,@tempdir);
      closedir TEMP;
      return 0;
   }
}
print "--------ReadDir----------\n";
#调用函数pdir,获得第一个目录下面的所有符合条件的目录,并保存到alldir中
pdir("D:/Perl/perl-exec/test/");
my $n = @alldir;
#遍历alldir,依次获取alldir中每个元素目录下面的目录,再将结果保存到alldir中
for (my $j=0;$j<$n;$j++)
{
  pdir($alldir[$j]);
  #重置循环种子,使循环可以循环到数组的结尾,遍历所有元素
  $n = @alldir;
}
将红色部分换成你的目录就行
作者: hitsubunnu    时间: 2009-06-04 17:34

  1. grep -l -r "*" ./ |xargs perl -pi.bk -e "$_ = '' if(m!/\*!..m!\*/!);"
复制代码

作者: xht314    时间: 2009-06-05 11:44
非常感谢 shihao138096  朋友占用自己的时间为我写出了这个脚本.  效果很好!  在此表示非常感谢!另外还有其它热心的朋友.   也同样感谢你们的热心帮助!
作者: shihao138096    时间: 2009-06-05 13:14
标题: 回复 #13 xht314 的帖子
不用啦,你应该感谢qiguojie,我的目录遍历使用的是他(她)提供的代码。
这里我只做了一下文件操作了,呵呵。
作者: xht314    时间: 2009-06-05 13:37
s/\/\*.*\n//;
    s/\s*\*.*\n//;
    s/(.*?)\/\*.*?\*\//$1/;

这三步替换正则有BUG, 能否用一个正则来代替呢?
作者: shihao138096    时间: 2009-06-05 14:00
有什么问题呀,能具体说一下吗?

[ 本帖最后由 shihao138096 于 2009-6-5 14:03 编辑 ]
作者: ILoveMK    时间: 2009-06-05 14:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: xht314    时间: 2009-06-05 14:04
在我的文件中有这样的语句:
import    java.io.*;

执行完脚本后变成   import java.io.  了
我觉得应该是分步替换的问题.  能不能用一个正则表式呢?   例如:  m!/\*!..m!\*/!
我刚才试了不,但不知该怎么用.
作者: ILoveMK    时间: 2009-06-05 14:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: shihao138096    时间: 2009-06-05 14:30
标题: 回复 #18 xht314 的帖子
不好意思,你把前两句改成以下两句,应该就没问题了:
s/^\/\*.*\n//;
s/^\s*\*.*\n//;
作者: shihao138096    时间: 2009-06-05 14:36
标题: 回复 #19 ILoveMK 的帖子
收藏了,谢谢ILoveMK 分享

[ 本帖最后由 shihao138096 于 2009-6-5 14:37 编辑 ]
作者: xht314    时间: 2009-06-05 15:07
不行啊! 问题更严重了!      /**  没有被去掉!
作者: xht314    时间: 2009-06-05 15:21
while(<FILEHANDLER>){
s/^\/\*.*\n//;
s/^\s*\*.*\n//;
s/(.*?)\/\*.*?\*\//$1/;

    push @file_content,$_;
   }

替换成

   while(<FILEHANDLER>){

   $_ = print if(m!/\*!..m!\*/!);
    push @file_content,$_;
   }


把注释部分替换成N个1了, 我知道是因为print反回结果造成的. 有没有办法解决呢??     用一个正则表达式不能匹配吗???    很着急呀.
作者: hitsubunnu    时间: 2009-06-05 15:51
原帖由 xht314 于 2009-6-5 15:21 发表
while(){
s/^\/\*.*\n//;
s/^\s*\*.*\n//;
s/(.*?)\/\*.*?\*\//$1/;

    push @file_content,$_;
   }

替换成

   while(){

   $_ = print if(m!/\*!..m!\*/!);
    push @file_content,$_;
...

不是都给你写好了吗

  1. grep -l -r "*" /your/path/ |xargs perl -pi.bk -e "$_ = '' if(m!/\*!..m!\*/!);"
复制代码

作者: shihao138096    时间: 2009-06-05 16:30
标题: 回复 #23 xht314 的帖子
不好意思 ,刚出去了一下,你说的那个问题主要是因为在你的/**前面有空格:现在将那三个正则表达式改为如下形式:
s/^\s*\/\*.*\n//;
s/^\s*\*.*\n//;
s/(.*?)\/\*.*?\*\//$1/;
作者: shihao138096    时间: 2009-06-05 16:37
标题: 回复 #24 hitsubunnu 的帖子
hitsubunnu ,能不能解释一下 m!/\*!..m!\*/!呀,我初学者 ,谢谢了
作者: MMMIX    时间: 2009-06-05 18:23
原帖由 shihao138096 于 2009-6-5 16:37 发表
hitsubunnu ,能不能解释一下 m!/\*!..m!\*/!呀,我初学者 ,谢谢了

这个你看 perlop 中对 m// 和 .. 的描述就清楚了。另外,这个不是正则表达式,而是一个 .. 表达式。
作者: shihao138096    时间: 2009-06-06 23:05
标题: 回复 #27 MMMIX 的帖子
谢谢了,就说呢,因为已经学习了一段时间perl了,可是就没看到(在基础教程中)这样的写法。太感谢了
作者: 小公猫    时间: 2009-06-06 23:48
如果是注释就跳过
把要的内容另存为一个文件
作者: shihao138096    时间: 2009-06-07 16:40
标题: 回复 #29 小公猫 的帖子
你说的也未尝不是一个方法,但是好像有点绕了,我感觉




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2