提问人:Evgeniy 提问时间:5/17/2022 更新时间:5/17/2022 访问量:246
编码蝙蝠计数YZ
Codingbat countYZ
问:
来自 Codingbat 的任务:
给定一个字符串,计算以“y”或“z”结尾的单词数 - 因此“heavy”中的“y”和“fez”中的“z”计算,但“yellow”中的“y”不计算(不区分大小写)。如果一个单词后面没有紧跟的字母,我们会说 y 或 z 位于单词的末尾。(注意:测试字符是否为字母。Character.isLetter(char)
countYZ("fez day") → 2
countYZ("day fez") → 2
countYZ("day fyyyz") → 2
我正在尝试像这样解决此任务:
public int countYZ(String str) {
String regex = "(.[.^y^z]\\b)";
return str.toLowerCase().replaceAll(regex, "").length();
}
但并非所有测试都通过了。如何修复正则表达式 = “(.[.^y^z]\b)“才能通过所有测试?
答:
1赞
The fourth bird
5/17/2022
#1
您可以在不跟字符 a-z 的捕获组中捕获 y 或 z,并匹配任何其他字符。
在替换中,使用捕获组 1。
([yYzZ](?![A-Za-z]))|.
解释
(
捕获组 1[yYzZ]
将 y 或 z 匹配为小写或大写(?![A-Za-z])
否定前瞻,断言不要直接向右显示字符 A-Za-z
)
关闭组 1|
或.
匹配任何其他字符
例
public int countYZ(String str) {
String regex = "([yYzZ](?![A-Za-z]))|.";
return str.toLowerCase().replaceAll(regex, "$1").length();
}
或者 unicode 变体以获得更广泛的匹配:
public int countYZ(String str) {
String regex = "([YyZz])(?!\\p{IsAlphabetic})|.";
return str.toLowerCase().replaceAll(regex, "$1").length();
}
评论
0赞
Evgeniy
5/17/2022
不幸的是,此代码没有通过 Codingbat 上的所有测试。
0赞
The fourth bird
5/18/2022
@EugeneKhlebnikov 现在代码确实通过了所有测试。
-1赞
zzzzz
5/17/2022
#2
最好限制使用正则表达式。 您可以像这样制定解决方案:
public static int countYZ(String str) {
String[] strings = str.toLowerCase().split("\\s");
int n = 0;
for (String s : strings) {
if (s.endsWith("y") || s.endsWith("z")) {
n++;
}
}
return n;
}
评论
0赞
Evgeniy
5/17/2022
您的代码不起作用,例如,在本例中:countYZ(“!!天--呀!!“)
0赞
zzzzz
5/17/2022
当然,正如我从评论中了解到的那样,单词应该用空格分隔。在任何交易品种中,我们都应该使用正则表达式。将书面方法的第一行替换为:.String[] strings = str.toLowerCase().split("\\W");
评论