Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算两个辅音之间的元音_Java_String - Fatal编程技术网

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

我试图用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, 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
。这不是一个简单的修复,因为第一个和最后一个索引的技巧不再有效。这有一个正则表达式,但它有点复杂。我很快会发布一篇编辑文章。你知道我认为你在文章中发现了一个错误