初学正则表达式2(在Perl下使用)

来源:互联网 发布:家具销售软件哪种好 编辑:程序博客网 时间:2024/05/28 23:09
/**  * 在Perl下的使用:  *     #华氏温度和摄氏温度之间的转换功能更加完善print "请输入要转换的温度,例如:20C/30F\n";$input = <STDIN>; #获取输入的内容chomp($input);    #去掉文本结尾的换行if($input =~ m/^([-+]?[0-9]+(\.[0-9]*)?) *([CFcf])$/){ # m/^([-+]?[0-9]+)(\.[0-9]*)?([CFcf])$/等价于:$inputNum = $1;                            # m/^([-+]?[0-9]+(\.[0-9]*)?)([CFcf])$/$type = $2;if($type eq "F"){$huashi = ($inputNum * 9 / 5) + 32;printf "华氏温度为:%.2f转换之后的华氏温度为:%.2f\n",$inputNum,$huashi;}else{$sheshi = ($inputNum - 32) * 5 / 9 ;printf "摄氏温度为:%.2f转换之后的摄氏温度为:%.2f\n",$inputNum,$sheshi;}}else{print "输入错误\"$input\"\n";}   *   * Perl里面的(?:   )表示只分组不捕获  * 上面程序的规则表达式改为  m/^([-+]?[0-9]+(?:\.[0-9]*)?) *([CFcf])$/  *   * [ |\t]*与[ *|\t*]的异同:\t表示空白字符包括换行、制表符等  * [ |\t]*可以匹配   \t\t  \t\t  \t \t\t\t    * [ *|\t*]只能匹配:\t\t\t\t或                                        无数的空格  *   * \b 用来匹配一个单词的分界符  * \s 匹配所有空白包括空格、回车、制表符、换行符。  * m//i  :i是m//的修饰符可以忽略大小写。  *       :g是全局匹配的意思  *       :x宽松排列的表达式  * 查找并替换:  * $var =~ s/regex/replacement/  * $var =~ s/\bSun\b/Sun/i 的作用 Sun不管单词的大小写都会被替换为Sun  *   * 公函生成程序:  * 给定一个数保留两位或三位小数:  * 当小数点后面的第三位不是0时,保留三位小数,否则保留两位小数  */  // $price =~ s/^([0-9]+\.[0-9][0-9][0-9]?)[0-9]*/$1/  // $price =~ s/(\.\d\d[0-9]?)\d*/$1/  /**   * perl -p -i".bak" -e "s/read/ready/g" file   * perl -w mkreply king.in > king.out   * <>操作符   * while($line = <>){   * if(line =~ m/^\s*$/){   * last; #停止while循环内的处理,跳出循环   * }   * #...处理header信息...   * if($line =~ m/^Subject:(.*)/i){   *$subject = $1;   *}   * }   * ...处理邮件的其他信息...   * 环视:在检查匹配的过程中不会占用任何字符   * 肯定顺序环视:(?=   ) 从左向右   * 肯定逆序环视:(?<=   )从右向左   * 举例:longlong xiao   * (?=xiao)则匹配的是xiao之前的空格这个位置           * 把环视和正则表达式结合起来可以更加准确的匹配位置。   * 例如:longlongxiao和longxiao   * (?=longlognxiao)long 分别匹配上面的两个字符串第二个则不能匹配到结果   * 上面表达式的意思是匹配long,但是(?=longlongxiao)则限制了必须是longlongxiao这个字符串里面的内容   * 几个例子:   * names改变为name's   * 1、s/names/name's/g   * 2、s/\bnames\b/name's/g   * 3、s/\b(name)(s)\b/$1'$2/g   * 4、s/\bname(?=s\b)/name'/g   * 5、s/(?<=\bname)(?=s\b)/'/g 找到一个位置紧跟在name之后,又在s之前   *    * 一个具体的例子:在长数字里面加入逗号,每隔三位加入一个逗号。   * 思路:从右边开始,每隔三位插入一个逗号,不再数字的前面加入逗号。   * 三位数字\d\d\d,三的倍数(\d\d\d)+,结尾\b 位置(?=(\d\d\d)+\b)   * 限制不在数字的前面加逗号,即不在,123,456一前面加逗号 (?<=\d)   * 综合起来:(?<=\d)(?=(\d\d\d)+\b)   * 思考:(?<=\d)(?(\d\d\d)+\b)和(?=(\d\d\d)+\b)(?<=\d)匹配结果有区别吗?答案在右边                                                     木有   * 为了提高性能我们可以把捕获型括号改变为非捕获型(?<=\d)(?(?:\d\d\d)+\b)   * 在perl中使用s/(?<=\d)(?=(?:\d\d\d)+\b)/'/g   * 对987654321使用的结果是:987,654,321   * 如果把正则表达改为s/(?<=\d)(?=(?:\d\d\d)+)/'/g则会出现9,8,7,6,5,4,321   * 分析:先定位到一个数字,然后如果后面有三位数字或三位数字的倍数则添加,    * 另外两种否定环视(前面两种被称为肯定环视):   * 否定顺序环视:<?!   >    (子表达式不能匹配右侧的文本)   * 否定逆序环视:<?<!   >   (子表达式不能匹配左侧的文本)   * 单词的起始分节符和结束分节符:   * 起始分界符:右侧是单词,左侧不是单词(?=\w)(?<!\w)   * 结束分界符:左侧是单词,右侧不是单词(?=\w)(?<!\w)   * 那么\b(单词分界符)就等价于(?=\w)(?<!\w)|(?=\w)(?<!\w)*/


#单词去重问题的解决$/ = ".\n";#设定特殊的额快模式;读取一块文本的终结为点号和换行符的结合体while(<>){#读取一块文本保存在默认的变量里面 next unless s{\b([a-z]+)(?:\s|<[^>]+>)+(\1\b)}     {\e$1\e$2}igx;s/^(?:[^\e]*\n)+//mg;s/^/$ARGV:/mg;print;}

代码分析:



JAVA代码:

package RegularExpression;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.regex.Pattern;import org.slf4j.Logger;import org.slf4j.LoggerFactory;//单词去重public class WordReduceRepeat {private static Logger  logger = LoggerFactory.getLogger("RegularExpression");private static String fileName = "src/RegularExpression/sun.txt";public static void main(String[] args) {Pattern regex1 = Pattern.compile("\\b([a-z]+)((?:\\s|\\<[^>]\\>)+)(\\1\\b)",Pattern.CASE_INSENSITIVE);String replace = "\033$1\033$2\033$3\033";Pattern regex2 = Pattern.compile("^(?:[^\\e]*\\n)+",Pattern.MULTILINE);Pattern regex3 = Pattern.compile("^([^\\n]+)",Pattern.MULTILINE);try {BufferedReader be = new BufferedReader(new FileReader(fileName));String text;try{while((text = getPara(be))!=null){text = regex1.matcher(text).replaceAll(replace);text = regex2.matcher(text).replaceAll("");text = regex3.matcher(text).replaceAll(fileName+":$1");System.out.println(text);writeToFile(fileName, text);}}catch(IOException e){logger.info("文件读写错误!"+e);}finally{try {be.close();} catch (IOException e) {logger.info("文件关闭失败!"+e);}}} catch (FileNotFoundException e) {logger.info("文件没有找到"+e);}}//end main()//从文件中读取数据,返回一个字符串public static String getPara(BufferedReader in) throws IOException{StringBuffer sb = new StringBuffer();String line;while(((line = in.readLine()) != null) && ( ((sb.length()) == 0)||((line.length()) != 0)) ){sb.append(line+"\n");}return sb.length() == 0 ? null : sb.toString();}//end getPara()//把改变的内容存入到另外一个文件中public static void writeToFile(String fileName,String content){String[] path = fileName.split("/");String newFileName = path[0]+"/"+path[1]+"/"+"新"+path[2];try {BufferedWriter bw = new BufferedWriter(new FileWriter(newFileName));try{bw.write(content);}finally{bw.flush();bw.close();}} catch (IOException e) {logger.info("文件写入错误"+e);}}//end writeToFile()}



0 0
原创粉丝点击