怎么在字符串中截取字数不同的汉字名字?

lc_comeon 发布于 01/10 18:39
阅读 412
收藏 2

“张三dkjsg,李小四skchduilh,王五dhskl,欧阳大神dhh,.....”

这样很长的字符串,怎样截取出名字?求教大神指点!

加载中
0
lc_comeon
lc_comeon

用substring的话,名字长短不同就搞不定

tcxu
tcxu
中文字符的统一编码 UNICODE 是在一定范围内的,我想可以一个一个字符地排查,若给定的字符在这个范围之内,那它一定是汉字,据此,将这个字符挑出来。
0
吴Yuan_小森森
tcxu
tcxu
回复 @tcxu : 测试表明 正则表达式 regular expression 的方法可用。为此,我已经补充了我下面的答案。
tcxu
tcxu
我见到有人使用正则 String regex = "[\u4e00-\u9fa5。,?”“《》:!——-、]"; :https://wenda.so.com/q/1473976607723092 但我没有测试它的代码。
0
Mariwoluo
Mariwoluo
用正则区分中文和字母
tcxu
tcxu
回复 @tcxu : regular expression 的方法可行。我试了一下,已经将测试结果,补充到了下面的答案之中。
tcxu
tcxu
用正则怎么区分?是不是类似:--- String regex = "[\u4e00-\u9fa5。,?”“《》:!——-、]"; --- ?
0
tcxu
tcxu

1.   中日韩统一表意文字(CJK Unified Ideographs),目的是要把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字。其在统一编码 UNICODE 中的范围:4E00..9FFF。常用汉字 的unicode 码范围是:\u4e00-\u9fa5。  据此,可以编写JAVA 代码来提取常用汉字。鉴于你的字符串中的逗号字符的UNICODE 是 65292,若要提取中文名加逗号,那代码可以写成:

public class CJK{
    public static void main(String[] args) {	
     String data=
     "张三dkjsg,李小四skchduilh,王五dhskl,欧阳大神dhh";
     for (int i=0;i<data.length();i++){
     	int n =(int)data.charAt(i);
     	if (((n>=19968) && (n<=40869)) || n==65292)
     	System.out.print(data.charAt(i));
     	}
     }
}

输出:

张三,李小四,王五,欧阳大神

2.  利用定义了分隔符的令牌字符串 java.util.StringTokenizer, 也可以提取中文名称。

import java.util.*;
public class Chinese_Selected {
public static void main(String args[]){
String text="张三dkjsg,李小四skchduilh,王五dhskl,欧阳大神dhh,.....";	
/*定义分隔符仅为英文大小写字母:a,b,....x,y,z,A,B,....X,Y,Z,保留其它字符 */
String delim = "a";
for (int i=98;i<=122;i++)
delim += "," + (char)i ;
for (int i=65;i<=90;i++)
delim += "," + (char)i ;
/* 生成定义了分隔符的字符串,以便取出令牌,即中文名称 */
StringTokenizer s = new StringTokenizer(text,  delim); 
	while(s.hasMoreTokens()) {//while循环体的条件是:有下一个令牌
	String ss = s.nextToken();//获取下一个中文中文字符串令牌
	System.out.print(ss + " ");
	}
  }
}

3. 当然,使用正则表达式,也能奏效。

import java.lang.*;
import java.util.regex.*;
import java.io.*;
public class Regular_Expression {
    private static String draw(String content){
        StringBuffer english = new StringBuffer();
        
        String regex = "[\u4e00-\u9fa5。,?”“《》:!——-、]";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(content);
        while(matcher.find())
        {
            String temp = matcher.group();
            english.append(temp);
        }
        return english.toString();
    }
    public static void Regular_Expression(String path){
        FileInputStream fr;
        BufferedReader br;
        
        FileWriter fw;
        BufferedWriter bw = null ;
        try{
            fr = new FileInputStream(path);
            br = new BufferedReader(new InputStreamReader(fr,"gb2312"));
            fw = new FileWriter("new1.txt");
            bw = new BufferedWriter(fw);
            String str = null;
            StringBuffer sb = new StringBuffer();
            while((str = br.readLine()) != null) {
                sb.append(str + "\n");
            }
            String temp = draw(sb.toString()); 
            System.out.println(temp);
            bw.write(temp);
            
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
        finally{
            try{
                if(bw != null) bw.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args){
        Regular_Expression("draw1.txt");
    }
}

 

tcxu
tcxu
回复 @Unique_dw : 我看不出你的评论。你的字符不能正常显示。
Unique_dw
Unique_dw
��������
0
g
googlewell
用分词库估计可以,但是觉得没必要。可以通过UTF-8编码解决,中文编码一般是3位的。
0
tcxu
tcxu

引用来自“小99”的评论

正则

所言极是:

import java.lang.*;
import java.util.regex.*;
import java.io.*;
public class 正则 {
	public static void main(String arg[]){
	
        String content="张三dkjsg,李小四skchduilh,王五dhskl,欧阳大神dhh,....";
        
        String regex = "[\u4e00-\u9fa5。,?”“《》:!——-、]";//正则
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(content);
        while(matcher.find()) {
            String temp = matcher.group();
            System.out.print(temp );
        }

    }
}

输出:

张三,李小四,王五,欧阳大神,

 

0
tcxu
tcxu

引用来自“小99”的评论

正则

已知 调用 php 的函数split, 可以用正则表达式将字符串分割到数组中,就是说,它可以将字符串依指定的规则切开。故,

  1. 首先生成一个 包含 大写英文字母, 小写英文字母的数组 $delim
  2. 再将 $delim转变为字符串 $c
  3. 将 $c以正则表达式 regular expression 的形式 “[$c]”, 作为 函数 split 的第一个参数,
  4. 将要解析的数据字符串 $data 作为函数 split 的第二个参数

从而实现消除英文字符(作为分隔符 delimiter 的英文字符 ,自动消失了),提取中文字符串的功能。

<meta charset=utf-8 />
<?php  
$data = '张三dkjsg,李小四skchduilh,王五dhskl,欧阳大神dhh,.....';
// 生成一个包含 大写英文字母, 小写英文字母的数组
$delim = array_merge( range('a', 'z'), range('A', 'Z'));
$c=implode("",$delim);
$arr = @split("[$c]", $data);
foreach($arr as $value) 
echo $value." " ; 
?>

输出:

张三 ,李小四 ,王五 ,欧阳大神 ,.....

 

0
tcxu
tcxu

引用来自“小99”的评论

正则

利用JS 的正则表达式,也能消除字符串里的英文字符串。

<meta charset=utf-8 />
<script type="text/javascript">
 var data = "张三dkjsg,李小四skchduilh,王五dhskl,欧阳大神dhhABC .....";
 var reg = /[\u0041-\u005a,u0061-\u007a]/g; //任何英文大小写字母的正则表达
 //用无字符'' 替换 data中的任何英文大小写字母,效果是:删除了任何英文字符
 var result=data.replace(reg,''); 
 alert(result);
document.write(result);
</script>

输出:

张三,李小四,王五,欧阳大神 .....

 

0
huhuiling
huhuiling
正则,用[\u4e00-\u9fa5]中文字符集及group方法可将其提取
返回顶部
顶部