如何只使用正则表达式匹配单词?

时间:2013-05-12 17:14:48

标签: c# regex

这是一个双重问题 1.如何隐含地包含外国字符?
2.如何摆脱结束的空字符串?

IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+");

上面的工作就像一个魅力。然后德国人开始抱怨他们的一些话被分成了两半。当字符串包含点缀或重音字符时,会发生这种情况。解决这个问题的一种方法是在模式中添加更多字符,但之后我们有法语,波兰语和基本上任何非英语语言(只有拉丁字符有效)。

什么是模式化所有字符和数字以及短划线的更好方法?

当我使用不同的弦乐时,我也注意到如果最后有一个问号,我会得到一个空字符串作为最后一个分割部分。我只是检查最后一个元素是否为空字符串并立即将其剪掉。

为什么我会得到它,如何摆脱它?

3 个答案:

答案 0 :(得分:2)

Regex + Linq怎么样?

IEnumerable<String> words = Regex.Split(input, @"[^\w0-9-]+")
                                 .Where(s => !String.IsNullOrWhiteSpace(s));

非正则表达式解决方案也是可能的

var words = new string(input.Select(c => char.IsLetterOrDigit(c) || c=='-' ? c : ' ').ToArray())
            .Split()
            .Where(s=>!String.IsNullOrWhiteSpace(s));

答案 1 :(得分:1)

请参阅:MSDN: Character Classes in Regular Expressions了解.NET flavor regex:

编辑并且,作为参考,有一篇文章解释了为什么这一切都有效(并且a-zA-Z没有)here

您还问过如何摆脱结束的空字符串?

String.Split为您提供了删除空条目的选项,Regex.Split没有。您的空条目是由于您使用?作为分割点,因为您要识别要用于分割的非单词字符。您有两个简单的选择:

  • 测试IEnumerable中的空条目
  • 更新您的正则表达式,以便它不会与您的上一个非单词字符匹配

但是,如果您执行第二个选项,您将最终得到最后一个IEnumerable条目中包含的最后一个字符(您的?)。所以,第一个选项更好,除非你想改变你这样做的方式来使用正匹配来拉出连续的单词,例如:

MatchCollection m = new Regex("\\w+").Matches(input);
List<string> words = new List<string>();
foreach (Match item in m)
{
    words.Add(item.Value);
}

答案 2 :(得分:0)

使用.NET,这将仅匹配单词(即使它们被双引号或使用非字母数字字符进行前缀/后缀。

Regex(@“ [^ 0-9-!$%^&@#*()_ + |〜=`{} []:;'<>?,。/”“”“”“] \ w +“)

将匹配变量txt中的文本:

var txt = "000 fred is just \"mad:)\"."

具有: [“ fred”; “是”; “只是”; “疯了”]