一个从源代码里提取中文字符串的java类

工作中需要优化代码里的中文警示语和异常信息,实在比较多,所以就写了个程序专门从代码里提取中文字符串。

java做的,比较简单,放上来备忘

package com.extractstr.app;

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 搜索字符串并输出到控制台
 */
public class ExtractStr {
    public static String getHelpString(String[] args){
        String result = String.format("%s [path]", new Object[]{"a"});
        return result;
    }

    private void getFiles(String rootPath, final String fileExt, List<File> fileList){
        File f =new File(rootPath);
        File[] list=f.listFiles(new FileFilter() {
            @Override
            public boolean accept(File f) {
                boolean ret = f.isDirectory() || (f.isFile() && f.getName().endsWith(fileExt));
                return ret;
            }
        });
        for(File fn : list){
            if (fn.isDirectory()){
                this.getFiles(fn.getAbsolutePath(), fileExt, fileList);
            }else{
                fileList.add(fn);
            }
        }
    }

    public List<File> run(String rootPath, String fileExt){
        List<File> result = new LinkedList<File>();
        this.getFiles(rootPath, fileExt, result);
        return result;
    }

    public List<String> parserSourceFile(List<String> patternList, File file, int miniCharCount) throws Exception {
        List<String> result = new LinkedList<String>();
        BufferedReader r = new BufferedReader(new FileReader(file));
        char[] buffer = new char[(int)file.length()];
        r.read(buffer, 0, (int)file.length());
        String text=new String(buffer, 0, buffer.length);

        for(String patternStr : patternList){
            //Pattern pattern = Pattern.compile("\"(.*?)\"");
            Pattern pattern = Pattern.compile(patternStr);
            Matcher matchers= pattern.matcher(text);
            while(matchers.find()){
                String t=matchers.group();
                if (t.length()>=miniCharCount)
                    result.add(t);
            }
        }
        return result;
    }

    public static void main(String []args){
        if (args.length==0){
            StringBuilder sb = new StringBuilder()
                    .append("未传入需要搜索的有效的源代码路径")
                    .append("\n")
                    .append(ExtractStr.getHelpString(args));
            System.out.println(sb.toString());
            System.exit(1);
        }
        List<String> searchFolders=new ArrayList<String>(100);
        for(int i=0; i<=args.length-1;i++){
            File f=new File(args[i]);
            if (!f.isDirectory() || !f.exists())
                continue;
            searchFolders.add(f.getAbsolutePath());
        }

        List<String> patternList = new LinkedList<String>();
        patternList.add("‘([\\u4E00-\\u9FA5]+)‘");
        patternList.add("\"([\\u4E00-\\u9FA5]+)\"");

        ExtractStr es = new ExtractStr();
        List<File> fileList = new ArrayList<File>(1000);
        for(String sarchFolder : searchFolders){
            List<File> t=es.run(sarchFolder, ".php");
            fileList.addAll(t);
        }

        Set<String> outList=new HashSet<String>();
        for(File f : fileList){
            try{
                List<String> items=es.parserSourceFile(patternList, f, 12);
                outList.addAll(items);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        for(String str : outList){
            System.out.println(str);
        }
    }
}

对于拼接字符串的中文输出支持的不算好,而且也对中文的长度有限制(最少12个字符)

时间: 2024-08-06 03:45:18

一个从源代码里提取中文字符串的java类的相关文章

MyBatis里json型字段到Java类的映射

一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字段串字段与Java类的相互类型转换. 当然,你可以为每个类写一个MyClassTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐. 有了泛型,一个通用的TypeHandler直接搞定. 二.源码 package com.xxx.typehandler; import c

提取中文字符串

protected void Page_Load(object sender, EventArgs e) { string str = "asdf进杂货"; Response.Write(GetChineseWords(str)); Response.Write("<br/>"); foreach (char c in str) { if (Regex.IsMatch(c.ToString (), "^[\u4E00-\u9FFF]+$&quo

一个简单的spring 程序(如何在java类中读取Properties配置文件)

首先是个User类: package spring_introduction;public class User {String name; public String getName() {return name;} public void setName(String name) {this.name = name;}public void hello(){System.out.println("hello "+name);}} 配置文件Name.properties name=L

php 字符串转数组 提取中文 提取英文 字符串类型

获取字符串类型 /**  * 判断中英文  */ public function checkStr($str){ $output = ''; ///\<[\s\S]*\>/i $a = preg_match('/[' . chr(0xa1) . '-' . chr(0xff) . ']/i', $str); $b = preg_match('/[0-9]/i', $str); $c = preg_match('/[a-zA-Z]/i', $str); if($a && $b &

传入一个中文字符串,返回一个字符串中的中文拼音

/** * @param 传入一个中文字符串 * @return 返回一个字符串中的中文拼音 */ private String getNameNum(String name) { if (!Utils.isStrEmpty(name)) { int len = name.length(); char[] nums = new char[len]; for (int i = 0; i < len; i++) { String tmp = name.substring(i); nums[i] =

使用javascript从一个字符串提取自字符串

问题:有一个字符串是由ijige句子组成,其中的一个句子拥有一个项目列表,该列表以一个冒号开始(:),以一个句点结束(.),我们如何去提取这个列表 解决思路:使用indexof+String方法来找到冒号,然后再次使用它找到冒号后面的第一个据点,有了这两个位置,使用String subString方法提取字符串 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title&

自定义一个函数截取中文字符串

/** * 截取中文字符串 * @param unknown $str 要截取的字符串 * @param unknown $encode 字符编码 * @param unknown $start 开始位置 * @param string $len 要截取的长度 * @return string */function getStr($str,$encode,$start,$len=null){ switch ($encode) { case 'utf8':$num = 3;break; case

在JavaScript里嵌入大量字符串常量的方法

[转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大量的字符连接符号甚至加上缩进,强制换成好几行.例如: var html = '<div>' + '<p>Hello</p>' + '<p>World'</p>' + '</div>'; 这还好,要是字符串里有不少双引号单引号,那就更麻烦了

php 中文字符串截取乱码

PHP截取字符串如果是英文直接用substr就可以了,但对于中文字符,用substring可能会导致乱码,那么将如何解决呢? 1.通过函数mb_substr实现 说明:mb_substr($str, $start, $length, $encoding);通过该函数即可,但需要加载php_mbstring.dll扩展. 案例: <?php  $str = '这是一个字符串切割函数';  echo "mb_substr:".mb_substr($str, 0, 7, 'utf-8'