为什么matche的结果与表达式不同?

时间:2017-03-16 03:15:53

标签: c# regex

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”。

我在哪里做错了?

1 个答案:

答案 0 :(得分:2)

你正在尝试实现的正则表达式有点偏差。让我们看看并分析它。

首先,我们需要指出我们实际上是在尝试匹配一个有开头和结尾的单词。这意味着我们需要在 ^ 前加上正则表达式,并在末尾添加 $ 以指示字符串开头并结束。

然后我们需要确保我们实际上有一个单词,这意味着至少有一个字符。要强制执行“一个或多个字符”规则,我们需要使用 + 量词而不是 *

最后,您尝试使用的正则表达式模式无法确保我们使用 一行中的字符。它确实为每个捕获组(OR运算符之间的部分)确保了但是我们最终拥有尽可能多的捕获组,因为有些场景应该使字符串无效。这基本上意味着以下单词仍将验证:

today

正则表达式将匹配三个捕获组:“to”,“da”和“y”。相反,我们需要明确设置分组。 我最终得到了以下模式:

^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$