Java中如何判断一个字符串是Java代码还是英文呢?
时间:2022-04-29
本文章向大家介绍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;
}
}
}
最后输出:
英文
- 黑产用“未来武器”破解验证码,打码小工都哭了
- Docker Registry v2 配置文件详解
- 在生产环境使用 Docker
- Docker 相关概念总览
- Docker 远程连接 -- dockerd 命令详解
- 在开发环境使用 Docker
- Docker Cloud 简介
- 一封伪造邮件引发的“探索”(涉及钓鱼邮件、SPF和DKIM等)
- Docker 镜像多阶段构建
- 利用WCF改进文件流传输的三种方式
- 利用系统特性伪装成一个免密登陆后门
- Docker 桌面版支持 kubernetes
- OOB(out of band)分析系列之DNS渗漏
- VLC播放器加载恶意字幕文件导致执行任意代码漏洞分析与POC实现
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释