Leetcode有一个问题:“给定一个单词列表,返回可以在美国键盘的一行上使用字母表键入的单词。”为了解决这个问题,我尝试在C#中使用正则表达式:
public string[] FindWords(string[] words)
{
return words.Where(x => Regex.Match(
x, @"[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*",
RegexOptions.IgnoreCase).Value == x).ToArray();
}
但仍然无法正确。例如,当输入像: [“a”,“b”,“p”,“你好”]
我只能返回“p”。
我在哪里做错了?
答案 0 :(得分:2)
你正在尝试实现的正则表达式有点偏差。让我们看看并分析它。
首先,我们需要指出我们实际上是在尝试匹配一个有开头和结尾的单词。这意味着我们需要在 ^ 前加上正则表达式,并在末尾添加 $ 以指示字符串开头并结束。
然后我们需要确保我们实际上有一个单词,这意味着至少有一个字符。要强制执行“一个或多个字符”规则,我们需要使用 + 量词而不是 * 。
最后,您尝试使用的正则表达式模式无法确保我们使用 仅 一行中的字符。它确实为每个捕获组(OR运算符之间的部分)确保了但是我们最终拥有尽可能多的捕获组,因为有些场景应该使字符串无效。这基本上意味着以下单词仍将验证:
today
正则表达式将匹配三个捕获组:“to”,“da”和“y”。相反,我们需要明确设置分组。 我最终得到了以下模式:
^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$