如何判断一个字符串是java代码还是英文单词?

考虑如下的两个字符串:


 1. for(int i=0; i < b.size();i++){
 2. do something in English(not necessary to be a sentence).

我们很容易就看出来,第一个是java代码,第二个则是英文句子。那么计算机程序有事如何区分这两者的呢?

java code可能不可解析,因为它是一段完整的方法(或声明或表达式),下面提供了这个问题的解决方法。有时,Java代码和英文单词并没有完全划清楚的界限,这中解决方案并不是100%的准确可靠。然而,这样的解决方案你只需要根据你业务需求稍作调整就能满足你的要求,你也可以从GitHub下载相关代码。

这方案的基本思想就是将字符串转成一组标记符号。比如,上面的代码可能会成为:“KEY,SEPARATOR,ID,ASSIGN,NUMBER,SEPARATOT,…”,然后再使用一些简单的规则就能把Java代码从英文中区分出来。

下面提供一个可将字符串转换为一组标记的Tokenizer类。

package lexical;

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关键字,运算符,标示符,分隔符,等等。并分配一个映射值的标示符(用于存储Java的关键字),这样以来就很容易区分Java代码和英文了。

package lexical;

import greenblocks.javaapiexamples.DB;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import NLP.POSTagger;

public class EnglishOrCode {

    private static Tokenizer tokenizer = null;

    public static void initializeTokenizer() {
        tokenizer = new Tokenizer();

        //key words
        String keyString = "abstract assert boolean break byte case catch "
                + "char class const continue default do double else enum"
                + " extends false final finally float for goto if implements "
                + "import instanceof int interface long native new null "
                + "package private protected public return short static "
                + "strictfp super switch synchronized this throw throws true "
                + "transient try void volatile while todo";
        String[] keys = keyString.split(" ");
        String keyStr = StringUtils.join(keys, "|");

        tokenizer.add(keyStr, 1);
        tokenizer.add("\\(|\\)|\\{|\\}|\\[|\\]|;|,|\\.|=|>|<|!|~|"
                        + "\\?|:|==|<=|>=|!=|&&|\\|\\||\\+\\+|--|"
                        + "\\+|-|\\*|/|&|\\||\\^|%|\‘|\"|\n|\r|\\$|\\#",
                        2);//separators, operators, etc

        tokenizer.add("[0-9]+", 3); //number
        tokenizer.add("[a-zA-Z][a-zA-Z0-9_]*", 4);//identifier
        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("English");
        }else{
            System.out.println("Java Code");
        }

    }

    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;
        }
    }
}

输出结果:

English
Java Code

原文链接

时间: 2024-10-09 23:32:12

如何判断一个字符串是java代码还是英文单词?的相关文章

Java判断一个字符串是否是包含某个字符

Java判断一个字符串是否是包含某个字符 在java中我们经常要判断一个字符串是否被包含在另外一个字符集中,那么如何用代码实现这个功能需求呢? contains方法 该方法返回true,如果此字符串包含,否则返回false. public class containString { public static void main(String[] args) { String str1 = "sdfsfsfa2we"; String str2 = "we"; Sys

Java基础知识强化47:StringBuffer类之判断一个字符串是否对称案例

1. 分析:判断一个字符串是否是一个对称的字符串,我们只需要把字符串的第1个字符和最后1个字符,第2个字符和倒数第2个字符,…… 比较的次数是长度除以2. 2. 案例演示: 1 package cn.itcast_07; 2 3 import java.util.Scanner; 4 5 /* 6 * 判断一个字符串是否是对称字符串 7 * 例如"abc"不是对称字符串,"aba"."abba"."aaa"."mna

java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”

在javascript中有一个方法isDigit()使用来判断一个字符串是否都是数字,在java的字符串处理方法中没有这样的方法,觉得常常需要用到,于是上网搜了一下,整理出了两个用正则表达式匹配的判断方法,如下: // 判断一个字符串是否都为数字 public boolean isDigit(String strNum) { return strNum.matches("[0-9]{1,}"); } // 判断一个字符串是否都为数字 public boolean isDigit(Str

java 判断一个字符串中的数字:是否为数字、是否包含数字、截取数字

题外话: JavaScript中判断一个字符是否为数字,用函数:isDigit(); 一.判断一个字符串是否都为数字 package com.cmc.util; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DigitUtil { public static void main(String[] args) { String str="123d"; System.out.prin

判断一个字符串是不是一个合法的IP地址

最近在笔试的时候遇到碰一道算法题, 要求判断一个字符串是不是合法的ip地址. 将我的思路发出来分享一下,不一定正确,也不一定是最优的方法.希望能分享一些交流 要求用java或者c来实现,我的java代码: 1 public class Test_ip { 2 //程序入口 3 public static void main(String[] args) { 4 Solution s = new Solution(); // 业务逻辑放在Solution类里面 5 //String test_st

判断一个字符串是否是ip地址的实现方法

最近在学习java,研究一些算法,找些联系题,自己去下手试试.这里记录下学习历程,也增强自己的记忆.初学者,见笑了.从开始判断一个字符串是不是正规ipv4的地址开始练习吧,初步代码如下: public class isIpv4{ public String cutblank(String str){ //如果字符串前有空格            while(str.startsWith(""))            {            str=  str.substring(1

算法积累(字符串转换驼峰,判断一个字符串中那个字母出现次数最多,并且出现了几次)

因为算法比较烂,所以想做一下这方面的积累. 尽量能够每天学习一个新算法吧.(不过估计很悬) 好吧,今天第一个是字符串转换驼峰 直接上代码 var str = 'toupper-case'; var arr = str.split('-'); //toupper,case for (var i = 1; i < arr.length; i++) { //把除了第一个数组后面的数组的第一个值设置为大写然后大写字母和去掉第一个字符的剩下的字符进行拼合 arr[i] = arr[i].charAt(0)

判断一个字符串里是否含有某段字符?怎么截取一段字符?

写前端过程中遇到的最多的字符串操作莫过于 :判断一个字符串里是否含有某段字符 ,和 截取一段字符串. 字符串操作有很多方法,其实一般只要掌握以上两个就够用了,其他方法随他去吧,好,下面就以上两个方法讲解一下. 1.判断一个字符串是否含有某段字符,使用indexOf()方法: str.indexOf("参数1","参数2");参数1表示判断是否包含的小字符串, 参数2表示从左到有依次判断的起始位置,默认从0开始,str表示用于寻找的原字符串,ps:如果原字符串含多个判

判断一个字符串中是否含有中文字符:

python中的encode和decode: 首先,在Python中字符串的表示是 用unicode编码.所以在做编码转换时,通常要以unicode作为中间编码. decode的作用是将其他编码的字符串转换成unicode编码,比如 a.decode('utf-8'),表示将utf-8编码的字符串转换成unicode编码 encode的作用是将unicode编码的字符串转换成其他编码格式的字符串,比如b.encode('utf-8'),表示将unicode编码格式转换成utf-8编码格式的字符串