使用正则表达式的模式匹配

时间:2015-03-23 15:19:01

标签: java regex servlets

我正在阅读文本文件并尝试将模式与文本文件的行行匹配。

例如,如果在我的文本文件中的行看起来像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',但它不会这样做。请帮忙。

1 个答案:

答案 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('\'',"");
}

你的问题不是很清楚,但我希望这至少可以指出你正确的方向。祝你好运!