Java中的正则表达式,匹配项存储在ArrayList中

Java中的正则表达式,匹配项存储在ArrayList中,java,regex,arraylist,Java,Regex,Arraylist,我编写了以下代码,用于存储和显示所有以字母a开头,以z结尾的单词。首先,我从我的正则表达式模式中得到一个错误,其次,我从没有显示存储到ArrayList中的内容(字符串)中得到一个错误 import java.io.*; import java.util.ArrayList; import java.util.Scanner; import java.util.regex.*; public class RegexSimple2{ public static void main(S

我编写了以下代码,用于存储和显示所有以字母
a
开头,以
z
结尾的单词。首先,我从我的正则表达式模式中得到一个错误,其次,我从没有显示存储到ArrayList中的内容(字符串)中得到一个错误

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.*;


public class RegexSimple2{

    public static void main(String[] args) {
        try{
            Scanner myfis = new Scanner("D:\\myfis2.txt");
            ArrayList <String> foundaz = new ArrayList<String>();
            while(myfis.hasNext()){
                String line = myfis.nextLine();
                String delim = " ";
                String [] words = line.split(delim);
                 for ( String s: words){
                    if(!s.isEmpty()&& s!=null){
                        Pattern pi = Pattern.compile("[a|A][a-z]*[z]");
                        Matcher ma = pi.matcher(s);
                        boolean search = false;
                        while (ma.find()){
                            search = true;
                            foundaz.add(s);
                        }
                        if(!search){
                            System.out.println("Words that start with a and end with z have not been found");
                        }
                    }
                }
            }

            if(!foundaz.isEmpty()){
                for(String s: foundaz){
                    System.out.println("The word that start with a and ends with z is:" + s + " ");
                }
            }
        }
        catch(Exception ex){
            System.out.println(ex);
        }
    }
}
import java.io.*;
导入java.util.ArrayList;
导入java.util.Scanner;
导入java.util.regex.*;
公共类RegexSimple2{
公共静态void main(字符串[]args){
试一试{
扫描仪myfis=新扫描仪(“D:\\myfis2.txt”);
ArrayList foundaz=新的ArrayList();
while(myfis.hasNext()){
String line=myfis.nextLine();
字符串delim=“”;
String[]words=line.split(delim);
for(字符串s:单词){
如果(!s.isEmpty()&&s!=null){
Pattern pi=Pattern.compile(“[a | a][a-z]*[z]”);
匹配器ma=π匹配器;
布尔搜索=假;
while(ma.find()){
搜索=真;
foundaz.add(s);
}
如果(!搜索){
System.out.println(“未找到以a开头、以z结尾的单词”);
}
}
}
}
如果(!foundaz.isEmpty()){
用于(字符串s:foundaz){
System.out.println(“以a开头,以z结尾的单词是:“+s+”);
}
}
}
捕获(例外情况除外){
系统输出打印项次(ex);
}
}
}

您需要更改在中读取文件的方式。此外,将正则表达式更改为
[aA].*z
*
匹配任何内容中的零个或多个。请参见下面我所做的小改动:

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.*;

public class Test {

    public static void main(String[] args) {

        try {
            BufferedReader myfis = new BufferedReader(new FileReader("D:\\myfis2.txt"));
            ArrayList<String> foundaz = new ArrayList<String>();

            String line;
            while ((line = myfis.readLine()) != null) {
                String delim = " ";
                String[] words = line.split(delim);

                for (String s : words) {                    
                    if (!s.isEmpty() && s != null) {
                        Pattern pi = Pattern.compile("[aA].*z");
                        Matcher ma = pi.matcher(s);

                        if (ma.find()) {
                           foundaz.add(s);
                        }
                    }
                }
            }

            if (!foundaz.isEmpty()) {
                System.out.println("The words that start with a and ends with z are:");
                for (String s : foundaz) {
                    System.out.println(s);
                }
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}
产出为:

The words that start with a and ends with z are:
applez
Applez
import java.io.*;
导入java.util.ArrayList;
导入java.util.Scanner;
导入java.util.regex.*;
公共类RegexSimple2
{
公共静态void main(字符串[]args){
尝试
{
Scanner myfis=新扫描仪(新文件(“D:\\myfis2.txt”);
ArrayList foundaz=新的ArrayList();
while(myfis.hasNext())
{
String line=myfis.nextLine();
字符串delim=“”;
String[]words=line.split(delim);
对于(字符串s:words){
如果(!s.isEmpty()&&s!=null)
{
Pattern pi=Pattern.compile(“[aA].*z”);
匹配器ma=π匹配器;
if(ma.find()){
foundaz.add(s);
}
}
}
}
if(foundaz.isEmpty())
{
System.out.println(“没有找到匹配的单词!”);
}
如果(!foundaz.isEmpty())
{
System.out.print(“以a开头,以z结尾的单词是:\n”);
用于(字符串s:foundaz)
{
系统输出打印项次;
}
}
}
捕获(例外情况除外)
{
系统输出打印项次(ex);
}
}
}

您会遇到什么错误?始终张贴stacktrace,并指出它发生在代码的哪一行上。它不会返回任何错误。但是我的代码行为不正确。首先它说:“以字母a开头,以z结尾的单词还没有找到。”。如果我用以下通用表达式[a-z]*修改我的正则表达式,它将打印与以下单词数量相等的行数:以a开头,以z结尾的单词是:D:\\myfis2.txt”。我做错了什么:-(为什么
z
放在括号中?放一个字母在括号中没有意义。还有
[a | a]
应该是
[aA]
(a | a)
[a | a]
将匹配
a
a
,而
(a | a)
将匹配
a
。这里是。是的,它适用于您考虑的输入,但第一个字符组(
[a | a]
)在我对这个问题的评论中不必要地包含了
|
:模式也将匹配
|pplez
。这是一个,你会发现它可以根据需要工作,没有过度。谢谢,我将编辑我的答案,而不使用
|
。但真正的问题是他在文件中的阅读方式,而不是regex.Cool。尽管这两个都是问题。Ge正确设置正则表达式是很重要的。我经常看到一些模式没有得到充分的约束并声明为“有效”;但是如果一个模式包含的太多,那么声明它“有效”是非常不合适的。谢谢大家的帮助:-)
The words that start with a and ends with z are:
applez
Applez
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.*;

public  class RegexSimple2
{

     public static void main(String[] args) {   

          try
          {
         Scanner myfis = new Scanner(new File("D:\\myfis2.txt"));
          ArrayList <String> foundaz = new ArrayList<String>();


        while(myfis.hasNext())
        {
            String line = myfis.nextLine();
            String delim = " ";
            String [] words = line.split(delim);



     for (String s : words) {                    
                    if (!s.isEmpty() && s != null) 
                    {
                        Pattern pi = Pattern.compile("[aA].*z");
                        Matcher ma = pi.matcher(s);

                        if (ma.find()) {
                           foundaz.add(s);
                        }
                    }
                }
            }
                    if(foundaz.isEmpty())
                {
                    System.out.println("No matching words have been found!");
                }
                    if(!foundaz.isEmpty())
                    {
                        System.out.print("The words that start with a and ends with z are:\n");
                        for(String s: foundaz)
                        {
                            System.out.println(s);
                }

        }

    }





catch(Exception ex)
     {
        System.out.println(ex); 
     }
}
}