Java中如何判斷一個字串是Java程式碼還是英文呢?
阿新 • • 發佈:2022-04-29
先給出以下兩個字串:
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; } } }
最後輸出:
英文