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);
}
}
}