if语句无意中过早终止for循环(Regex)

时间:2017-10-14 03:57:49

标签: java regex

我正在努力确保forename和surname字符串的第一个字母是大写字母。我有一些java代码如下,对于我的生活我不知道为什么它只适用于stringbuffer中的第一个字符,并不会执行其余的循环。我相信这是我的正则表达式中的一个错误,我不太清楚。

我90%肯定是因为空间和空间冒号出现在原始字符串中。

原始字符串显示为

StringBuffer output = new StringBuffer(forename + ", " + surname);

爪哇

int length_of_names = Director.getSurname().length() + Director.getForename().length() + 2;    
Pattern pattern = Pattern.compile("\\b([A-Z][a-z]*)\\b");
            Matcher matcher = pattern.matcher(output.append(Director));


            for(int i = 0; i < length_of_names; i++)
            {
             if (matcher.find() == true)
             { 
                output.setCharAt(i, Character.toUpperCase(output.charAt(i)) );
                continue;
             }

            }

一个好的,快速的101正则表达式语句以及如何撰写它们也将受到赞赏

1 个答案:

答案 0 :(得分:0)

免责声明:这个答案做了很多假设。答案的目的是显示有问题的代码问题,即使假设错误也是如此。

假设:

  1. forename的值与Director.getForename()返回的值相同。

  2. surname的值与Director.getSurname()返回的值相同。

  3. output来电时matcher(...)的价值如前所示。

  4. Director.toString()已实施为return surname + ", " + forename;。确切的实施并不重要,但其余的答案都假设了这种实施方式。

  5. 为了便于说明,forename = "John"surname = "Doe"

  6. 现在,让我们通过代码看看发生了什么:

    StringBuffer output = new StringBuffer(forename + ", " + surname);
    

    output的值现在为"John, Doe"(9个字符)。

    int length_of_names = Director.getSurname().length() + Director.getForename().length() + 2;
    

    length_of_names的值计算为9

    使用int length_of_names = output.length()可以更好地完成此操作。

    Pattern pattern = Pattern.compile("\\b([A-Z][a-z]*)\\b");
    Matcher matcher = pattern.matcher(output.append(Director));
    

    Director.toString()"Doe, John")返回的字符串会附加到output,结果值为"John, DoeDoe, John"。该值将提供给匹配器。

    使用该正则表达式模式,匹配器将找到"John""John"。它找不到"DoeDoe",因为它在中间有一个大写字母。

    结果是find()两次返回true,所有后续调用都将返回false

    for(int i = 0; i < length_of_names; i++)
    {
        if (matcher.find() == true)
        { 
            output.setCharAt(i, Character.toUpperCase(output.charAt(i)) );
            continue;
        }
    }
    

    循环迭代9次,值i08(包括)。

    前两次迭代输入if语句,因此代码将大写output中的前两个字符,从而产生值"JOhn, DoeDoe, John"

    continue语句无效,因为无论如何循环都会继续。

    <强> OOPS !!

    这不是代码应该做的。所以,解决它:

    • 不要将Director追加到output

    • 不要迭代9次。相反,迭代直到find()返回false

    • 使用找到的文本的位置将字符定位为大写。

    这使得代码看起来像这样:

    StringBuffer output = new StringBuffer(forename + ", " + surname);
    Pattern pattern = Pattern.compile("\\b([A-Z][a-z]*)\\b");
    Matcher matcher = pattern.matcher(output);
    while (matcher.find()) {
        int i = matcher.start();
        output.setCharAt(i, Character.toUpperCase(output.charAt(i)));
    }
    

    当然,代码仍然完全没有意义,因为你匹配以大写字母开头的单词,所以将第一个字母改为大写将完全没有任何作用。