1. 程式人生 > 其它 >Java中如何判斷一個字串是Java程式碼還是英文呢?

Java中如何判斷一個字串是Java程式碼還是英文呢?

先給出以下兩個字串:

1、for (int i = 0; i< b.size(); i++) {

2、do something in English

從人工角度看,很顯然第一個是Java程式碼,第二個是英語;那麼在Java中如何通過程式碼檢測第一個是Java程式碼,第二是英語呢?

第一個Java程式碼可能無法解析的,因為它並不是一個完整的方法或宣告的表示式;下面為這一問題提供瞭解決方案。

解決的基本思路是將字串轉換為一組的令牌,例如,上面的程式碼行可能會成為“Java關鍵字、分隔符、運營商、識別符號,……”;然後我們可以用英語簡單的規則來分析程式碼。

實現程式碼如下:

import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Tokenizer {
private class TokenInfo {
public final Pattern regex;
public final int token;
public TokenInfo(Pattern regex, int token) {
super();
this.regex = regex;
this.token = token;
}
}
public class Token {
public final int token;
public final String sequence;
public Token(int token, String sequence) {
super();
this.token = token;
this.sequence = sequence;
}
}
private LinkedList<TokenInfo> tokenInfos;
private LinkedList<Token> tokens;
public Tokenizer() {
tokenInfos = new LinkedList<TokenInfo>();
tokens = new LinkedList<Token>();
}
public void add(String regex, int token) {
tokenInfos
.add(new TokenInfo(Pattern.compile("^(" + regex + ")"), token));
}
public void tokenize(String str) {
String s = str.trim();
tokens.clear();
while (!s.equals("")) {
//System.out.println(s);
boolean match = false;
for (TokenInfo info : tokenInfos) {
Matcher m = info.regex.matcher(s);
if (m.find()) {
match = true;
String tok = m.group().trim();
s = m.replaceFirst("").trim();
tokens.add(new Token(info.token, tok));
break;
}
}
if (!match){
//throw new ParserException("Unexpected character in input: " + s);
tokens.clear();
System.out.println("Unexpected character in input: " + s);
return;
}
}
}
public LinkedList<Token> getTokens() {
return tokens;
}
public String getTokensString() {
StringBuilder sb = new StringBuilder();
for (Tokenizer.Token tok : tokens) {
sb.append(tok.token);
}
return sb.toString();
}
}

我們可以得到Java關鍵字、分隔符、運營商、識別符號,等,如果我們分配一個值對映到令牌,一串英語可以被轉換成一個字串的令牌。

實現程式碼如下:

import java.io.IOException;
import java.sql.SQLException;
public class EnglishOrCode {
private static Tokenizer tokenizer = null;
private static String keyStr="";
public static void initializeTokenizer() {
tokenizer = new Tokenizer();
tokenizer.add(keyStr, 1);
tokenizer.add("(|)|{|}|[|]|;|,|.|=|>|<|!|~|" + "?|:|==|<=|>=|!=|&&||||+
+|--|"
+ "+|-|*|/|&|||^|%|'|"| | |$|#", 2);
tokenizer.add("[0-9]+", 3);
tokenizer.add("[a-zA-Z][a-zA-Z0-9_]*", 4);
tokenizer.add("@", 4);
}
public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
initializeTokenizer();
String s = "do something in English";
if (isEnglish(s)) {
System.out.println("English");
} else {
System.out.println("Java Code");
}
s = "for (int i = 0; i < b.size(); i++) {";
if (isEnglish(s)) {
System.out.println("英文");
} else {
System.out.println("Java程式碼");
}
}
private static boolean isEnglish(String replaced) {
tokenizer.tokenize(replaced);
String patternString = tokenizer.getTokensString();
if (patternString.matches(".*444.*") || patternString.matches("4+")) {
return true;
} else {
return false;
}
}
}

最後輸出:

英文