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

C# 如何使用正则表达式只匹配单词?,c#,regex,C#,Regex,这是一个双重问题。 1.如何隐式合并外来字符? 2.如何去掉结尾的空字符串 IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+"); IEnumerable words=Regex.Split(输入“[^a-zA-Z0-9-]+”; 上面的方法很有效。然后德国人来了,开始抱怨他们的一些话被一分为二。当字符串包含虚线或重音字符时发生。解决这个问题的一种方法是在模式中添加更多字符,但我们有法语、波兰语和基本上任

这是一个双重问题。
1.如何隐式合并外来字符?
2.如何去掉结尾的空字符串

IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+");
IEnumerable words=Regex.Split(输入“[^a-zA-Z0-9-]+”;
上面的方法很有效。然后德国人来了,开始抱怨他们的一些话被一分为二。当字符串包含虚线或重音字符时发生。解决这个问题的一种方法是在模式中添加更多字符,但我们有法语、波兰语和基本上任何非英语语言(只有拉丁字符有效)

对所有字符、数字和破折号进行模式化的更好方法是什么?

当我弹奏不同的琴弦时,我也注意到如果在结尾有一个问号,我会得到一个空弦作为最后的分割部分。我只是检查最后一个元素是否为空字符串,并立即将其截断

我为什么要得到它以及如何摆脱它?请参见:对于.NET Flavor正则表达式:

  • 语法是
    \w
    (该表中的字符类是在中定义的。这与
    a-zA-Z0-9-
    几乎相同,但如果要排除下划线,可能需要使用
    \p{L}0-9-
    之类的方法
编辑:并且,作为参考,有一篇文章解释了为什么这一切都有效(而a-zA-Z没有)

您还问了如何去掉结尾的空字符串

IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+");
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);
}
MatchCollection m=new Regex(\\w+)。匹配(输入);
列表单词=新列表();
foreach(匹配项目,单位为m)
{
增加(项目价值);
}

Regex+Linq怎么样

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

使用.NET,这将只匹配单词(即使它们是双引号或前置/后置的非字母数字字符)

正则表达式(@“[^0-9-!$%”^&@#*()。+| ~=`{}[]:;'?,./”]\w+)

将匹配变量txt中的文本:

var txt = "000 fred is just \"mad:)\"."
与:
[“fred”;“is”;“just”;“mad”]

重复:@GuyL.可能不是重复的,询问.NET正则表达式不是Java,询问Split为何为该特定代码生成空条目