Java 字符串匹配如何实现

Java 字符串匹配如何实现,java,string,Java,String,我有一个类Matcher(),如下所示。find方法接受两个字符串:pattern(要查找的字符串)和source(要查找的字符串)。例如,如果pattern=“abc”和source=“abc cda abc”被传递给find方法。它返回[04],即模式abc(精确匹配)位于源的索引0和索引4处。无论你传递给模式,它都会把字符串看作一种模式。如果我想搜索多个模式,则无需修改以下Matcher类。最好的方法是什么?例如,我想从另一个类调用find方法,如果我在arraylist中存储了两个模式,

我有一个类Matcher(),如下所示。find方法接受两个字符串:pattern(要查找的字符串)和source(要查找的字符串)。例如,如果pattern=“abc”和source=“abc cda abc”被传递给find方法。它返回[04],即模式abc(精确匹配)位于源的索引0和索引4处。无论你传递给模式,它都会把字符串看作一种模式。如果我想搜索多个模式,则无需修改以下Matcher类。最好的方法是什么?例如,我想从另一个类调用find方法,如果我在arraylist中存储了两个模式,那么我想首先传递一个模式并返回结果,然后再次传递第二个模式并一次性返回结果。我只想在源代码中查找模式或arraylist中的模式之后停止处理。我需要你的想法

public class Matcher {

    public static List<Integer> find(String pattern, String source) {
        char[] x = pattern.toCharArray(), y = source.toCharArray();
        int i, j, m = x.length, n = y.length;
        List<Integer> result = new ArrayList<Integer>();

        /* Searching */
        for (j = 0; j <= n - m; ++j) {
            for (i = 0; i < m && x[i] == y[i + j]; ++i)
                ;
            if (i >= m)
                result.add(j);
        }

        return result;
    }

}
公共类匹配器{
公共静态列表查找(字符串模式、字符串源){
char[]x=pattern.toCharArray(),y=source.toCharArray();
int i,j,m=x.长度,n=y.长度;
列表结果=新建ArrayList();
/*搜寻*/
对于(j=0;j=m)
结果.添加(j);
}
返回结果;
}
}

那么,您希望您的方法
find
返回索引列表吗?你看了吗?那可能正是你想要的。

在我看来,你回答了你自己的问题。您需要在客户端代码中使用循环来重复调用find()方法。除非重写find方法,否则您将无法在一个调用中完成它,而您不想这样做。您的客户机代码为损坏的伪代码:

declare a Matcher object
for (each pattern I want to match)
  call the find method with the pattern and the source string
  store the result
end loop
你如何处理结果将取决于你需要如何处理它。您可以创建一个ArrayList对象并将列表对象附加到它。或者,如果需要知道哪个模式在哪里,可以创建一个HashMap并将该模式用作列表对象的键

如果我完全没有领会你的意思,请告诉我

干杯,
迪安

我把索引放在第4位。它应该是0和8。例如,如果pattern=“abc”和source=“abc cda abc”被传递给find方法。它返回[0 8],即在source的索引0和索引8处找到模式abc(精确匹配)。find方法已经返回索引列表。但find方法只适用于一种模式。我的arraylist有3种模式。我想对这三种模式执行find方法。对于第一个模式,调用find方法并返回索引。然后我想对第二个模式和返回索引做同样的操作,以此类推。好吧,假设您的模式在
List myPatterns
中,并且您的源代码在
source
中,为什么不:
for(String pattern:myPatterns){List results=Matcher.parse(pattern,source);/*handle results*/}
for(String pattern:Read.arrayList){List results=Matcher.find(pattern,source);System.out.println(results);}我使用了上面的循环,现在它的工作和打印索引。但是我不想打印索引,我想打印匹配的模式(string)。我应该向代码中添加什么以仅打印匹配的字符串。感谢您的帮助您知道匹配的模式;它是
模式
。因此,在获得
结果后
可以添加;
如果(!results.isEmpty()){System.out.println(模式);}
for(字符串模式:Read.arrayList){List results=Matcher.find(pattern,source);System.out.println(results);}我使用了上面的循环,现在它的工作和打印索引。但是我不想打印索引,我想打印匹配的模式(string)。我应该向代码中添加什么来只打印匹配的字符串。您使用的
System.out.println(results)
将使用
ArrayList
中定义的默认
toString
方法打印数组内容。您需要将模式与结果分开打印,并且需要编写嵌套循环来打印结果。例如:For(Integer result:results){System.out.println(result);}设置格式以满足您的显示需要。