Java 如何检查字母序列是否按顺序出现在字符串中?

Java 如何检查字母序列是否按顺序出现在字符串中?,java,string,Java,String,我正在研究一个方法,该方法将一个字符串数组和三个小写字母作为输入 该方法应查找以第一个字母开头的单词,并按插入顺序包含其他两个字母 如果一个字母插入两次,它应该在单词中出现两次 例如,单词expected是(e,e,e)的合法单词,但单词似乎不合法 通过我下面的代码,我得到的任何输入都是合法的,这是错误的 public static void printWords(String[] vocabulary, String firstLetter, String second

我正在研究一个方法,该方法将一个字符串数组和三个小写字母作为输入

该方法应查找以第一个字母开头的单词,并按插入顺序包含其他两个字母

如果一个字母插入两次,它应该在单词中出现两次

例如,单词
expected
(e,e,e)
的合法单词,但单词
似乎不合法

通过我下面的代码,我得到的任何输入都是合法的,这是错误的

    public static void printWords(String[] vocabulary,
        String firstLetter, String secondLetter, String thirdLetter){

    int counter=0;
    for (String str : vocabulary){
        int index1=0;
        int index2=0;
        String newstr=str;

        if (((str.substring(0,1).equals(firstLetter)))){
        newstr=str.substring(1, str.length());
        if (newstr.contains(secondLetter)){
            index1=str.indexOf(secondLetter);
            newstr=str.substring(index2, str.length());
        }
        if (newstr.contains(thirdLetter)){
            index2=str.indexOf(thirdLetter);

        }

        }
        if (index2>index1)
        {
            counter++;
            System.out.println(str);
        }

    }
    System.out.println("found "+ counter+" words");

}

使用正则表达式更容易实现:

boolean matches(String word, String letter1, String letter2, String letter3) throws IllegalArgumentException {

    String[] s = new String[] {letter1, letter2, letter3};

    for (String l : s) {
        if (l.length() != 1)
            throw new IllegalArgumentException("Wrong input, only 1-char strings are allowed!");
        if (l < "a" || l > "z")
            throw new IllegalArgumentException("Wrong input, only lowercase latin letters are allowed!");
    }   

    Pattern regex = Pattern.compile(s[0] + ".*" + s[1] + ".*" + s[2] + ".*");

    // will produce a regex like "a.*b.*c.*"

    return regex.matcher(word).matches();
}
布尔匹配(字符串字、字符串字母1、字符串字母2、字符串字母3)引发IllegalArgumentException{
字符串[]s=新字符串[]{letter1,letter2,letter3};
用于(字符串l:s){
如果(l.长度()!=1)
抛出新的IllegalArgumentException(“输入错误,只允许1字符字符串!”);
如果(l<“a”| l>“z”)
抛出新的IllegalArgumentException(“输入错误,只允许小写拉丁字母!”);
}   
Pattern regex=Pattern.compile(s[0]+“*”+s[1]+“*”+s[2]+“*”);
//将生成类似“a.*b.*c.”的正则表达式
返回regex.matcher(word.matches();
}

使用正则表达式更容易实现:

boolean matches(String word, String letter1, String letter2, String letter3) throws IllegalArgumentException {

    String[] s = new String[] {letter1, letter2, letter3};

    for (String l : s) {
        if (l.length() != 1)
            throw new IllegalArgumentException("Wrong input, only 1-char strings are allowed!");
        if (l < "a" || l > "z")
            throw new IllegalArgumentException("Wrong input, only lowercase latin letters are allowed!");
    }   

    Pattern regex = Pattern.compile(s[0] + ".*" + s[1] + ".*" + s[2] + ".*");

    // will produce a regex like "a.*b.*c.*"

    return regex.matcher(word).matches();
}
布尔匹配(字符串字、字符串字母1、字符串字母2、字符串字母3)引发IllegalArgumentException{
字符串[]s=新字符串[]{letter1,letter2,letter3};
用于(字符串l:s){
如果(l.长度()!=1)
抛出新的IllegalArgumentException(“输入错误,只允许1字符字符串!”);
如果(l<“a”| l>“z”)
抛出新的IllegalArgumentException(“输入错误,只允许小写拉丁字母!”);
}   
Pattern regex=Pattern.compile(s[0]+“*”+s[1]+“*”+s[2]+“*”);
//将生成类似“a.*b.*c.”的正则表达式
返回regex.matcher(word.matches();
}

如果您严格地说是给定的代码(尽管regex或其他方法更优雅、更好),那么应该是:

if (((str.substring(0,1).equals(firstLetter)))){
    newstr=str.substring(1, str.length());
    if (newstr.contains(secondLetter)){
        index1=newstr.indexOf(secondLetter) + 1;
        newstr=str.substring(index1 + 1, str.length());
    }
    if (newstr.contains(thirdLetter)){
        index2=newstr.indexOf(thirdLetter) + index1 + 1;

    }
    ....

如果您严格地说是给定的代码(尽管regex或其他一些方法更优雅、更好),那么应该是:

if (((str.substring(0,1).equals(firstLetter)))){
    newstr=str.substring(1, str.length());
    if (newstr.contains(secondLetter)){
        index1=newstr.indexOf(secondLetter) + 1;
        newstr=str.substring(index1 + 1, str.length());
    }
    if (newstr.contains(thirdLetter)){
        index2=newstr.indexOf(thirdLetter) + index1 + 1;

    }
    ....

你应该使用regex来处理它。你应该使用regex来处理它。请不要使用return true或false,只要使用:return regex.matcher(input.matches()。我是Java新手,我不知道regex是什么,你能解释一下吗?@Tam211 regex是一个非常强大的字符序列处理模式匹配引擎,用大多数语言实现。在您的例子中,
a.*b.*c.*
的意思是“从a开始,然后是任何字符的任何数字,甚至是0,然后是b,如果有任何字符,那么是任何数字,然后是c,然后是任何字符的任何数字”<模式中的code>
表示“任意字符”,
*
表示“任意数量的出现,甚至0”。如果您想做到完美,应该在模式的开头添加“^”,这表示第一个字母位于您要匹配的字符串的开头。@Dude在JS中是的,但在Java
中是匹配的()
对整个输入有效,而不是
find()
。请不要使用return true或false,只要使用:return regex.matcher(input.matches())我是Java新手,我不知道regex是什么,你能解释一下吗?@Tam211 regex是一个非常强大的字符序列处理模式匹配引擎,用大多数语言实现。在您的例子中,
a.*b.*c.*
的意思是“从a开始,然后是任何字符的任何数字,甚至是0,然后是b,如果有任何字符,那么是任何数字,然后是c,然后是任何字符的任何数字”<模式中的code>表示“任意字符”,
*
表示“任意数量的出现,甚至0”。如果您想做到完美,应该在模式的开头添加“^”,这表示第一个字母位于您要匹配的字符串的开头。@Dude在JS中是的,但在Java
中是匹配的()
针对整个输入工作,而不是
find()