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()
。