「java文本解析」java文本解析引擎
本篇文章给大家谈谈java文本解析,以及java文本解析引擎对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、JAVA中如何从一个文本中,把类名解析出来,并按序排放
- 2、java解析word文档有哪些方法
- 3、Java解析复杂文本
- 4、java中的文本分析
- 5、java解析txt里的数据
- 6、JAVA 文本表达式解析成数学公式,计算出结果
JAVA中如何从一个文本中,把类名解析出来,并按序排放
import java.io.*;
import java.util.regex.*;
import java.util.*;
public class daying //类名改一下
{
public static void main(String arg[])
{
File file=new File("D:/Users/Magic/Desktop","E_12.java");//要解析的文件所在目录
int n=(int)file.length();//文件长度
char[] c=new char[n];
TreeSetString treeset=new TreeSetString();
try
{
FileReader reader=new FileReader(file);
reader.read(c);//读入文件
String str=new String(c);
Pattern p=Pattern.compile("class [A-Z]\\w+");//只有类的名字且首字母为大写才被解析
Matcher m=p.matcher(str);
while(m.find())
{
StringBuffer s=new StringBuffer(m.group());//把前边的class关键字去除 只留后边类名
treeset.add(s.substring(6));
}
IteratorString iter=treeset.iterator();
while(iter.hasNext())//按名字顺序输出
{
System.out.println(iter.next());
}
reader.close();
}
catch(IOException e)
{
System.out.println(e);
}
}
}
java解析word文档有哪些方法
java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估
计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作
方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关
于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表
面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。
----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。
----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。
1、采用字节的形式读取rtf模板内容
2、将可变的内容字符串转为rtf编码
3、替换原文中的可变部分,形成新的rtf文档
主要程序如下:
public String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = bin.getBytes();
int bit;
for (int i = 0; i bs.length;i++) {
bit = (bs[i] 0x0f0)
4;
sb.append("\\'");
sb.append(digital[bit]);
bit = bs[i] 0x0f;
sb.append(digital[bit]);
}
return sb.toString();
}
public String readByteRtf(InputStream ins, String path){
String sourcecontent =
"";
try{
ins = new
FileInputStream(path);
byte[] b
= new byte[1024];
if (ins == null) {
System.out.println("源模板文件不存在");
}
int bytesRead = 0;
while (true) {
bytesRead = ins.read(b, 0, 1024); // return final read bytes
counts
if(bytesRead == -1) {// end of InputStream
System.out.println("读取模板文件结束");
break;
}
sourcecontent += new String(b, 0, bytesRead); // convert to string
using bytes
}
}catch(Exception e){
e.printStackTrace();
}
return sourcecontent ;
}
以上为核心代码,剩余部分就是替换,从新组装java中的String.replace(oldstr,newstr);方法可以实现,在这就不贴了。源代码部分详见附件。
运行源代码前提:
c盘创建YQ目录,将附件中"模板.rtf"复制到YQ目录之下,运行OpreatorRTF.java文件即可,就会在YQ目录下生成文件名如:21时15分19秒_cheney_记录.rtf
的文件。
package com;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class OperatorRTF {
public String strToRtf(String content){
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = content.getBytes();
int bit;
for (int i = 0; i bs.length; i++) {
bit = (bs[i] 0x0f0)
4;
sb.append("\\'");
sb.append(digital[bit]);
bit = bs[i] 0x0f;
sb.append(digital[bit]);
}
return sb.toString();
}
public String replaceRTF(String content,String replacecontent,int
flag){
String rc = strToRtf(replacecontent);
String target = "";
if(flag==0){
target = content.replace("$timetop$",rc);
}
if(flag==1){
target = content.replace("$info$",rc);
}
if(flag==2){
target = content.replace("$idea$",rc);
}
if(flag==3){
target = content.replace("$advice$",rc);
}
if(flag==4){
target = content.replace("$infosend$",rc);
}
return target;
}
public String getSavePath() {
String path = "C:\\YQ";
File fDirecotry = new File(path);
if (!fDirecotry.exists()) {
fDirecotry.mkdirs();
}
return path;
}
public String ToSBC(String input){
char[] c =
input.toCharArray();
for (int i =
0; i c.length; i++){
if (c[i] == 32){
c[i] = (char) 12288;
continue;
}
if (c[i] 127){
c[i] = (char) (c[i] + 65248);
}
}
return new
String(c);
}
public void rgModel(String username, String content) {
// TODO Auto-generated method stub
Date current=new Date();
SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd
HH:mm:ss");
String targetname = sdf.format(current).substring(11,13) + "时";
targetname += sdf.format(current).substring(14,16) + "分";
targetname += sdf.format(current).substring(17,19) + "秒";
targetname += "_" + username +"_记录.rtf";
String strpath = getSavePath();
String sourname = strpath+"\\"+"模板.rtf";
String sourcecontent = "";
InputStream ins = null;
try{
ins = new FileInputStream(sourname);
byte[] b = new byte[1024];
if (ins == null) {
System.out.println("源模板文件不存在");
}
int bytesRead = 0;
while (true) {
bytesRead = ins.read(b, 0, 1024); // return final read bytes
counts
if(bytesRead == -1) {// end of InputStream
System.out.println("读取模板文件结束");
break;
}
sourcecontent += new String(b, 0, bytesRead); // convert to string
using bytes
}
}catch(Exception e){
e.printStackTrace();
}
String targetcontent = "";
String array[] = content.split("~");
for(int i=0;iarray.length;i++){
if(i==0){
targetcontent = replaceRTF(sourcecontent, array[i], i);
}else{
targetcontent = replaceRTF(targetcontent, array[i], i);
}
}
try {
FileWriter fw = new FileWriter(getSavePath()+"\\" +
targetname,true);
PrintWriter out = new PrintWriter(fw);
if(targetcontent.equals("")||targetcontent==""){
out.println(sourcecontent);
}else{
out.println(targetcontent);
}
out.close();
fw.close();
System.out.println(getSavePath()+" 该目录下生成文件" +
targetname + " 成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
OperatorRTF oRTF = new OperatorRTF();
String content =
"2008年10月12日9时-2008年10月12日6时~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法~我们参照检验药品的方法";
oRTF.rgModel("cheney",content);
}
}
Java解析复杂文本
import java.io.*;
import java.util.*;
public class FileManager {
public ListDishes parseFile(File file) {
String str = null;
ListDishes list = new ArrayListDishes();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
while((str = br.readLine())!=null) {
if(str.startsWith("Name:")) {
int index = str.indexOf(":");
String dishName = str.substring(index+1,str.length());
str = br.readLine();
index = str.indexOf(":");
String categoriesString = str.substring(index+1,str.length());
String[] cateArr = categoriesString.split(",");
SetString categories = new HashSetString();
for(int j = 0;jcateArr.length;j++) {
categories.add(cateArr[j]);
}
SetString ingredients = new HashSetString();
String ss = br.readLine();
while((str = br.readLine()) != null !(str.length() == 0)) {
String[] strArr = str.split(" ");
for(int i = 0;istrArr.length;i++) {
ingredients.add(strArr[i]);
}
}
Dishes d = new Dishes();
d.setName(dishName);
d.setCategories(categories);
d.setIngredients(ingredients);
list.add(d);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
FileManager fm = new FileManager();
ListDishes list = new ArrayListDishes();
File file = new File("D:/dishes.txt");
list = fm.parseFile(file);
for(int i = 0; ilist.size();i++) {
System.out.println(list.get(i).getName());
System.out.println(list.get(i).getCategories());
System.out.println(list.get(i).getIngredients());
}
}
}
//菜肴类,一种菜对应于菜肴类的一的实例
class Dishes {
private String name;
private SetString Categories; //菜肴类别
private SetString ingredients; //菜肴配料
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public SetString getCategories() {
return Categories;
}
public void setCategories(SetString categories) {
Categories = categories;
}
public SetString getIngredients() {
return ingredients;
}
public void setIngredients(SetString ingredients) {
this.ingredients = ingredients;
}
}
java中的文本分析
BufferedReader br = new BufferedReader(new FileReader(要找的文件路径));
StringBuffer sb = br.readLine();
Pattern pattern = pattern.compile("(//d{3})(//d{3})(//d{1})(//d{10})");
Matcher m = pattern.matcher(sb);
while(m.find()) {
System.out.println(m.group());
}
可能不是您要的解决方法。不过大多数查找数据都是这个思路。
java解析txt里的数据
这个是文本流,先把文本读到内存中,再根据固定的格式去解析。按照换行解析
ListStudent list=new ArrayListStudent();
String encoding = "GBK";
File file = new File("c:/test.txt");
if (file.isFile() file.exists()) {
InputStreamReader read = new InputStreamReader( new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTXT = null;
while ((lineTXT = bufferedReader.readLine()) != null) {
String [] stuAttr=lineTXT.toString().split(",");
Student student=new Student();
//解析stuAttr数组封装Student对象
list.add(student);
}
read.close();
}else{
System.out.println("找不到指定的文件!");
}
JAVA 文本表达式解析成数学公式,计算出结果
正则表达分解字符串
然后运算
给你个例子。以前写的,现在忙没空给你写你这个了,public class CalStr { private String src;
/**
* constructor
*
* @param srcthe string(expression) to calculate
*/
public CalStr(String src) {
this.src = src;
}
/**
* calculate to get the result
*
* @return(double)result
*/
public double getResult() {
String postfix = getPostfix();
Stack stk = new Stack();
// System.out.println(postfix);
String parts[] = postfix.split( " + ");
double result = 0;
for (int i = 0; i parts.length; i++) {
char tmp = parts[i].charAt(0);
if (!isOperator(tmp)) {
stk.push(parts[i]);
} else {
double a = Double.parseDouble((String) stk.pop());
double b = Double.parseDouble((String) stk.pop());
// b is followed by a in the orignal expression
result = calculate(b, a, tmp);
stk.push(String.valueOf(result));
}
}
return result;
}
/**
* test if the character is an operator,such +,-,*,/
*
* @param opthe character to test
* @returntrue if op is an operator otherwise false
*/
private boolean isOperator(char op) {
return (op == '+ ' || op == '- ' || op == '* ' || op == '/ ');
}
/**
* calculate an expression such (a op b)
*
* @param anumber 1
* @param bnumber 2
* @param opthe operator
* @return(double)(a op b)
*/
public double calculate(double a, double b, char op) {
switch (op) {
case '+ ':
return a + b;
case '- ':
return a - b;
case '* ':
return a * b;
case '/ ':
return a / b;
}
return -1;
}
/**
* convert the suffix to postfix
*
* @returnthe postfix as a string
*/
private String getPostfix() {
Stack stk = new Stack();
String postfix = new String();
char op;
int i = 0;
while (i src.length()) {
if (Character.isDigit(src.charAt(i)) || src.charAt(i) == '. ') {
postfix += " ";
do {
postfix += src.charAt(i++);
} while ((i src.length())
(Character.isDigit(src.charAt(i))));
postfix += " ";
}
else {
switch (op = src.charAt(i++)) {
case '( ':
stk.push( "( ");
break;
case ') ':
while (stk.peek() != "( ") {
String tmp = (String) stk.pop();
postfix += tmp;
if (tmp.length() == 1 isOperator(tmp.charAt(0)))
postfix += " ";
}
stk.pop();
postfix += " ";
break;
case '+ ':
case '- ':
while ((!stk.empty()) (stk.peek() != "( ")) {
postfix += stk.pop() + " ";
}
stk.push(String.valueOf(new Character(op)));
break;
case '* ':
case '/ ':
while ((!stk.empty())
((stk.peek() == "* ") || (stk.peek() == "/ "))) {
postfix += stk.pop() + " ";
}
stk.push(String.valueOf(new Character(op)));
break;
}
}
}
ListIterator it = stk.listIterator(stk.size());
while (it.hasPrevious())
postfix += it.previous() + " ";
return postfix.trim().replaceAll( " +\\. ", ". ");
}
/**
* main function
*
* @param args
*/
public static void main(String args[]) {
System.out.println(new CalStr( "((1.5+6.000)*9+9.36)*(8+9-8*8+8*7) ")
.getResult());
}
}
java文本解析的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java文本解析引擎、java文本解析的信息别忘了在本站进行查找喔。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。