Java 计算两个辅音之间的元音
我试图用java从一个句子中找出两个Java 计算两个辅音之间的元音,java,string,Java,String,我试图用java从一个句子中找出两个r之间包含两个元音的单词。所以我读了句子,然后我必须找到符合上述标准的单词。例如,如果我有一个字符串,例如:“roar soccer花名册阅读器”,那么方法匹配应该为单词“roar”和“花名册”返回true 这就是我想出的方法,就是做这项工作 public boolean matches(String singleWord) { // set count to -1. it will increase to 2 if a 'r' is found, i
r
之间包含两个元音的单词。所以我读了句子,然后我必须找到符合上述标准的单词。例如,如果我有一个字符串,例如:“roar soccer花名册阅读器”,那么方法匹配
应该为单词“roar”和“花名册”返回true
这就是我想出的方法,就是做这项工作
public boolean matches(String singleWord)
{
// set count to -1. it will increase to 2 if a 'r' is found, it decreases for each vowel
int count = -1;
// loop through a single word
for (int i=0; i<singleWord.length(); i++){
// if a 'r' is found set the count to two
if(singleWord.charAt(i) == 'r'){
// when count it's 0 exit loop
if (count == 0)
return true;
count = 2;}
// if I find a vowel count decreases
else if(isVowel(singleWord.charAt(i))){
count--;}
}
return false;
}
您还可以使用正则表达式:
java.util.regex.Pattern.matches("\w*r\w*([aeiou]\w*){2}r\w*", "roar soccer roster reader");
public static boolean matches(final String singleWord) {
return singleWord.matches(".*r([^aeiour]*[aeiou]){2}[^aeiour]*r.*");
}
您还可以使用正则表达式:
java.util.regex.Pattern.matches("\w*r\w*([aeiou]\w*){2}r\w*", "roar soccer roster reader");
public static boolean matches(final String singleWord) {
return singleWord.matches(".*r([^aeiour]*[aeiou]){2}[^aeiour]*r.*");
}
可以使用不带循环的简单算法执行此操作:
- 查找第一个
'r'
- 查找最后一个
'r'
- 将子字符串剪切到两者之间
- 如果从子字符串中删除所有元音将使其至少缩短两个字符,则返回
true
boolean matches(String singleWord) {
int from = singleWord.indexOf('r');
int to = singleWord.lastIndexOf('r');
if (from < 0 || from == to) return false;
String sub = singleWord.substring(from+1, to);
return (sub.length() - sub.replaceAll("[aeiou]", "").length()) == 2;
}
为了理解这个regexp,您只需要知道,[…]
匹配括号内的任何字符,[^…]
匹配括号内字符以外的任何字符,*
匹配前面的子表达式零次或多次
这个表达式很长,但它是由一些琐碎的片段组成的。它匹配如下:
- 首字母
r
- 零个或多个非元音,除了
r
- 第一元音
- 零个或多个非元音,除了
r
- 第二个元音
- 零个或多个非元音,除了
r
- 关闭
r
boolean matches(String singleWord) {
return singleWord
.replaceAll("r[^raeiou]*[aeiou][^raeiou]*[aeiou][^raeiou]*r", "")
.length() != singleWord.length();
}
可以使用不带循环的简单算法执行此操作:
- 查找第一个
'r'
- 查找最后一个
'r'
- 将子字符串剪切到两者之间
- 如果从子字符串中删除所有元音将使其至少缩短两个字符,则返回
true
boolean matches(String singleWord) {
int from = singleWord.indexOf('r');
int to = singleWord.lastIndexOf('r');
if (from < 0 || from == to) return false;
String sub = singleWord.substring(from+1, to);
return (sub.length() - sub.replaceAll("[aeiou]", "").length()) == 2;
}
为了理解这个regexp,您只需要知道,[…]
匹配括号内的任何字符,[^…]
匹配括号内字符以外的任何字符,*
匹配前面的子表达式零次或多次
这个表达式很长,但它是由一些琐碎的片段组成的。它匹配如下:
- 首字母
r
- 零个或多个非元音,除了
r
- 第一元音
- 零个或多个非元音,除了
r
- 第二个元音
- 零个或多个非元音,除了
r
- 关闭
r
boolean matches(String singleWord) {
return singleWord
.replaceAll("r[^raeiou]*[aeiou][^raeiou]*[aeiou][^raeiou]*r", "")
.length() != singleWord.length();
}
可以使用正则表达式:
java.util.regex.Pattern.matches("\w*r\w*([aeiou]\w*){2}r\w*", "roar soccer roster reader");
public static boolean matches(final String singleWord) {
return singleWord.matches(".*r([^aeiour]*[aeiou]){2}[^aeiour]*r.*");
}
以下是测试代码:
for (String word: "roar soccer roster reader rarar".split(" "))
System.out.println(word+":"+matches(word));
以下是输出:
roar:true
soccer:false
roster:true
reader:false
rarar:false
可以使用正则表达式:
java.util.regex.Pattern.matches("\w*r\w*([aeiou]\w*){2}r\w*", "roar soccer roster reader");
public static boolean matches(final String singleWord) {
return singleWord.matches(".*r([^aeiour]*[aeiou]){2}[^aeiour]*r.*");
}
以下是测试代码:
for (String word: "roar soccer roster reader rarar".split(" "))
System.out.println(word+":"+matches(word));
以下是输出:
roar:true
soccer:false
roster:true
reader:false
rarar:false
那么
阅读器
呢?还有,是否有任何限制,比如不使用正则表达式?该方法是否应该为字符串“rarar”
返回true
?@tobias_k否没有限制一部分事实是我不太了解正则表达式…@dasblinkenlight它应该返回false@mikey有趣的因此,中间的<代码> r>代码>中断序列,对吗?<代码>读者>代码>?还有,是否有任何限制,比如不使用正则表达式?该方法是否应该为字符串“rarar”
返回true
?@tobias_k否没有限制一部分事实是我不太了解正则表达式…@dasblinkenlight它应该返回false@mikey有趣的因此,在<中间的代码> R>代码>中间,如果不是Ro.V.*([Aiouou\\W*){{ 2 } R\W*< /代码>,是的,你是对的,但是我对正则表达式的知识是一种灾难。我应该知道这一点topic@tobias_k谢谢,那肯定更好。编辑了这篇文章。如果两个r之间存在非vovel,这就不起作用。我会使用类似\w*r\w*([aeiou]\w*){2}r\w*
的东西。是的,你是对的,但我对正则表达式的了解是一场灾难。我应该知道这一点topic@tobias_k谢谢,那肯定更好。编辑了这篇文章。哇,谢谢!唯一的问题是,“roadster”
应该返回false,因为两个r
之间有三个元音,我想这只是更改(sub.length()-sub.replaceAll(“[aeiou]”,“).length())>=2的问题
到(sub.length()-sub.replaceAll(“[aeiou]”,“”)。length())==2
@mikey我认为你接受得太早了:对于“rarar”
@mikey,这个将返回true
。这不是一个简单的修复,因为第一个和最后一个索引的技巧不再有效。这有一个正则表达式,但它有点复杂。我很快会发布编辑。你知道我认为你发现了规格中的错误。。。练习要求我数一数包含两个r
s之间两个元音的句子中的单词。。为了测试这个程序,我得到了一堆单词,但没有一个像rarar这样的单词。。因此,我不再确定raraar
是否应该返回true
或false
。。对不起,哇,谢谢!唯一的问题是,“roadster”
应该返回false,因为两个r
之间有三个元音,我想这只是更改(sub.length()-sub.replaceAll(“[aeiou]”,“).length())>=2的问题
到(sub.length()-sub.replaceAll(“[aeiou]”,“”)。length())==2
@mikey我认为你接受得太早了:对于“rarar”
@mikey,这个将返回true
。这不是一个简单的修复,因为第一个和最后一个索引的技巧不再有效。这有一个正则表达式,但它有点复杂。我很快会发布一篇编辑文章。你知道我认为你在文章中发现了一个错误