我正在努力确保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正则表达式语句以及如何撰写它们也将受到赞赏
答案 0 :(得分:0)
免责声明:这个答案做了很多假设。答案的目的是显示有问题的代码问题,即使假设错误也是如此。
假设:
forename
的值与Director.getForename()
返回的值相同。
surname
的值与Director.getSurname()
返回的值相同。
output
来电时matcher(...)
的价值如前所示。
Director.toString()
已实施为return surname + ", " + forename;
。确切的实施并不重要,但其余的答案都假设了这种实施方式。
为了便于说明,forename = "John"
和surname = "Doe"
。
现在,让我们通过代码看看发生了什么:
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次,值i
从0
到8
(包括)。
前两次迭代输入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)));
}
当然,代码仍然完全没有意义,因为你匹配以大写字母开头的单词,所以将第一个字母改为大写将完全没有任何作用。