我正在阅读文本文件并尝试将模式与文本文件的行行匹配。
例如,如果在我的文本文件中的行看起来像IT&&HOD&&name'S.Roy'
,那么在我的程序中,我尝试在String z
变量中存储类似的模式,然后匹配{{1}使用文本文件模式将输出作为z
。
当我存储在S.Roy
之类的不同字符串中并使用正则表达式将b与文本文件行匹配时,它就会产生正确的结果。 String b="IT&&HOD&&name.*"
。
但是,当S.Roy
(具有与String z
相同的值)与文本文件行匹配时,它会显示b
。
"no match found"
对于任何查询@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String txt=request.getParameter("query");
if (txt.matches("Who is the(.*)")) {
String re1=".*?";
String re2="(?:[a-z][a-z]+)";
String re3=".*?";
String re4="(?:[a-z][a-z]+)";
String re5=".*?";
String re6="(?:[a-z][a-z]+)";
String re7=".*?";
String re8="((?:[a-z][a-z]+))";
String re9=".*?";
String re10="(?:[a-z][a-z]+)";
String re11=".*?";
String re12="((?:[a-z][a-z]+))";
Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10+re11+re12,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(txt);
if (m.find())
{
String word1=m.group(1);
String word2=m.group(2);
String z=word2.toString()+"&&"+word1.toString()+"&&"+"name.*"+"\n";
FileInputStream fstream = new FileInputStream(getServletContext().getRealPath("/database.txt"));
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
if( Pattern.matches(z,strLine)){
Pattern pattern = Pattern.compile("'(.*?)'");
Matcher matcher = pattern.matcher(strLine);
if (matcher.find()){
String a = matcher.group(1);
request.setAttribute("a",a);
request.getRequestDispatcher("/output.jsp").forward(request, response);
}
}
}
}
else{
String a="Match not found";
request.setAttribute("a",a);
request.getRequestDispatcher("/output.jsp").forward(request, response);
}
}
else{
String a = "Sorry......Invalid query !!!";
request.setAttribute("a",a);
request.getRequestDispatcher("/output.jsp").forward(request, response);
}
}
"Who is the HOD of IT"
会导致String z
在我的IT&&HOD&&name.*
中,它存储为database.txt
,因此尝试匹配这两者应该会导致IT&&HOD&&name'S.Roy'
,但它不会这样做。请帮忙。
答案 0 :(得分:0)
我不太确定我理解你的代码,但是你应该做的是从你的模式中得到三个部分,格式如下:
[类别]&安培;&安培; [标题]&安培;&安培;名称 '[名称]'
如果只是查找行是否是正确的格式(并且只有a-z upper / lower与。和[space]一起用于名称),那么这个正则表达式可以解决这个问题:
^[A-Za-z]+&{2}[A-Za-z]&{2}name'[ .A-Za-z]+'$
对于提取,不需要正则表达式,特别是因为你有"&&"
的分隔符而获得前两个部分。第二部分你可以使用正则表达式,但简单的替换可能更容易使用。假设您想要实际提取数据,则根本不需要正则表达式。
这就是我如何从线上提取这些值的方法。验证:
String category;
String title;
String name;
String line = /* populated from where ever */
//validate line is in correct format
if(str.matches("^[A-Za-z]+&{2}[A-Za-z]&{2}name'[A-Za-z]+'$")){
String[] parts = str.split("&&");
category = parts[0];
title = parts[1];
String temp = str.replace("name'","");
name = temp.replace('\'',"");
}
你的问题不是很清楚,但我希望这至少可以指出你正确的方向。祝你好运!