2017-03-16 99 views
0

在本文给出了有一个问题:“鉴于单词的列表,返回可使用在美国键盘只有一个行的英文字母打字的话。”为了解决这个问题,我尝试使用正则表达式在C#这样的:为什么matche的结果与表达式有所不同?

public string[] FindWords(string[] words) 
    { 
     return words.Where(x => Regex.Match(
     x, @"[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*", 
     RegexOptions.IgnoreCase).Value == x).ToArray(); 
    } 

但仍然不能得到right.For例如,当输入,如: [“A”,“B”,“P”, “你好”]

我只能得到 “p” 返回。

我在哪里做错了吗?

+0

什么是“不对”了。你需要学习[在提问前如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+0

@ScottChamberlain糟糕的例子。没有多少断言会帮助人们写出正确的正则表达式。是的,测试优先的方法虽然不错,但具有一定程度的理智和常识。如果我需要编写一个“Hello World”,那么至少编写7个关于该方法的断言和测试绝对是浪费时间。 –

+2

@PhilP。不,它仍然非常相关。建议从文章的主要peice的,这将是最有帮助的是*“[在加强通过该计划如果它没有做任何事情,这不是你的列表上,则无论你的清单有错误,在这种情况下,你不明白该程序确实存在,或者你的程序有错误,在这种情况下,你编写的代码是错误的。修复错误的东西。如果你不知道如何解决它,至少现在你有一个特定的技术问题,你可以问StackOverflow!“* OP在正则表达式中犯了一个错误,如果他把它分开,他可以判断出它有什么问题。 –

回答

2

你的正则表达式是有点过了你想要达到的目的。我们来看看并分析它。

首先,我们需要表明我们实际上是想匹配一个单词,它有一个起点和终点。这意味着,我们需要与^预先设置的正则表达式,并添加$在结束时表示字符串的开始和结束。

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

最后,您正在尝试使用并不能保证我们使用汉字是从只有一排的正则表达式。它确实确保了对于每个捕获组(OR运算符之间的部分),但是我们最终拥有尽可能多的捕获组,因为存在应该使字符串无效的场景。这基本上意味着,下面的字仍然将验证:

today 

正则表达式匹配3个捕获组:“来”,“DA”和“y”。相反,我们需要明确设置分组。 我已经结束了与以下模式:

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

谢谢!我用了一天的时间来验证表达式并反复查看Match函数的文档,但仍然无法正确进行....我似乎理解正则表达式不够熟悉...再次感谢您提供的非常有用的答案! – overflow

+0

@overflow我强烈建议使用https://regex101.com/来构建和验证Regex表达式。它提供了非常有用的解释,说明如何实际处理正则表达式(在右侧),并多次为我保存复杂的表达式。 –

+0

感谢您提供该网站,这对新手来说非常有价值 – overflow

相关问题