Atitit attilax擅长项目解析与大数据采集提取 词法分析 电话号码提取 package vcfvcardprj; import java.util.Collection; imp

本文介绍了一种从文本中提取电话号码的方法,并通过词法分析进行数据处理。使用了自定义的状态机来解析字符串,识别汉字、数字及分隔符,并将其转换为Token。此外,展示了如何从解析后的Token列表中抽取电话号码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Atitit attilax擅长项目解析与大数据采集提取   词法分析  电话号码提取

 

 

package vcfvcardprj;

 

import java.util.Collection;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

import com.alibaba.fastjson.JSON;

import com.attilax.fsm.TokenEndEx;

import com.attilax.parser.Token;

import com.google.common.collect.Lists;

 

public class mblFetch {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

String s = "周何琪__学校郑州大学__联系方式15538130516__身高体重162cm,47k";

s="天津广播影视职业学院 韩震宇 15641656234  161cm,44kg";

List<Token> process = new mblFetch().getTokens(s);

System.out.println( JSON.toJSONString(process,true) );

String cp=getMblCp(process);

System.out.println(cp);

 

}

 

private static String getMblCp(List<Token> process) {

for (Token token : process) {

if(new mblFetch().isnum(token.value))

return token.value;

}

   return "";

}

 

private char[] process(String s) {

// TODO Auto-generated method stub

return null;

}

 

int charIndex;

char cur_char;

char[] code_char_arr;

private String curStat ="start";

private List<Token> tokens_tmp;

private String curTokenTxt="";

 

@SuppressWarnings("unchecked")

public List<Token> getTokens(String codeStr) {

List<Token> li = Lists.newArrayList();

code_char_arr = codeStr.toCharArray();

 

while (true) {

Object tk;

try {

tk = nextTokens();

} catch (TokenEndEx e) {

break;

}

if (tk instanceof Token)

li.add((Token) tk);

else if (tk instanceof List)

li.addAll((Collection<? extends Token>) tk);

else

throw new RuntimeException("token type err,curchar:" + cur_char + ",colidx:" + charIndex);

 

}

 

return li;

 

}

 

/**

 *

 * @return token or list<token>

 * @throws TokenEndEx

 */

public Object nextTokens() throws TokenEndEx {

// code_char_arr = code.toCharArray();

charIndex++;

if (charIndex > code_char_arr.length - 1)

throw new TokenEndEx(new String(code_char_arr));

cur_char = code_char_arr[charIndex];

// cur_char=cur_char;

// if (this.curTokenTxt.equals("1598"))

// System.out.println("dbg");

// if(this.gColumn==30)

// System.out.println("dbg");

 

// get next char,,then change stat

// jude cur char and cur stat...then if or not chage stat

if (ishanzi(cur_char))

return hanziEvt();

else if (isnum(cur_char))

return numEvt();

else

return splitorCharEvt();

// break;

}

 

private Object numEvt() throws TokenEndEx {

 

if (this.curStat.equals("start")) {

this.curStat="numStat";

return gaziStat();

}

if (this.curStat.equals("numStat")) {

return gaziStat();

}

if (this.curStat.equals("hanziStat")) {  

this.curStat="numStat";

 return retNumtoken();

}

 

if (this.curStat.equals("splitorStat")) {

this.curStat="numStat";

return retSplitorToken();

}

return null;

}

 

private Object hanziEvt() throws TokenEndEx {

 

if (this.curStat.equals("start")) {

this.curStat="hanziStat";

return gaziStat();

}

if (this.curStat.equals("hanziStat")) {

return gaziStat();

}

// if is hanzi && cur is numstat

if (this.curStat.equals("numStat")) {

this.curStat="hanziStat";

return retNumtoken();

} 

if (this.curStat.equals("splitorStat")) {

this.curStat="hanziStat";

return retSplitorToken();

}

 

this.curStat="hanziStat";

return null;

 

 

}

 

 

private Object splitorCharEvt() throws TokenEndEx {

 

if (this.curStat.equals("start")) {

this.curStat="splitorStat";

return gaziStat();

}

if (this.curStat.equals("hanziStat")) {

this.curStat="splitorStat";

return retHeziToken();

}

if (this.curStat.equals("numStat")) {

this.curStat="splitorStat";

return retNumtoken();

}

 

//gazi 

this.curStat="splitorStat";

return gaziStat();

 

 

}

 

private Object retHeziToken() {

 

Token tk = new Token();

tk.Text = curTokenTxt.toString();

tk.Type = "hezi";

tk.value = curTokenTxt.toString();

curTokenTxt=String.valueOf(cur_char);

return tk;

}

 

 

 

private Object retNumtoken() {

 

Token tk = new Token();

tk.Text = curTokenTxt.toString();

tk.Type = "num";

tk.value = curTokenTxt.toString();

curTokenTxt="";

curTokenTxt=String.valueOf(cur_char);

return tk;

}

 

private Object retSplitorToken() {

 

Token tk = new Token();

tk.Text = curTokenTxt.toString();

tk.Type = "splitor";

tk.value = curTokenTxt.toString();

curTokenTxt=""; curTokenTxt=String.valueOf(cur_char);

return tk;

}

private Object gaziStat() throws TokenEndEx {

curTokenTxt = curTokenTxt + String.valueOf(cur_char);

return nextTokens();

}

 

private boolean ishanzi(char cur_char2) {

 

return isChinese(String.valueOf(cur_char2));

}

 

private boolean isnum(char cur_char2) {

String str = String.valueOf(cur_char2);

return isnum(str);

}

 

private boolean isnum(String str) {

for (int i = str.length(); --i >= 0;) {

if (!Character.isDigit(str.charAt(i))) {

return false;

}

}

return true;

}

 

public static boolean isChinese(String str) {

String regEx = "[\u4e00-\u9fa5]";

Pattern pat = Pattern.compile(regEx);

Matcher matcher = pat.matcher(str);

boolean flg = false;

if (matcher.find())

flg = true;

 

return flg;

}

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值