这是一个双重问题
1.如何隐含地包含外国字符?
2.如何摆脱结束的空字符串?
IEnumerable<String> words = Regex.Split(input, "[^a-zA-Z0-9-]+");
上面的工作就像一个魅力。然后德国人开始抱怨他们的一些话被分成了两半。当字符串包含点缀或重音字符时,会发生这种情况。解决这个问题的一种方法是在模式中添加更多字符,但之后我们有法语,波兰语和基本上任何非英语语言(只有拉丁字符有效)。
什么是模式化所有字符和数字以及短划线的更好方法?
当我使用不同的弦乐时,我也注意到如果最后有一个问号,我会得到一个空字符串作为最后一个分割部分。我只是检查最后一个元素是否为空字符串并立即将其剪掉。
为什么我会得到它,如何摆脱它?
答案 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:
\w
(该表中的字符类定义在Unicode Character Database。这几乎与a-zA-Z0-9-
相同,但如果要排除下划线,则可能需要使用\p{L}0-9-
之类的内容。编辑并且,作为参考,有一篇文章解释了为什么这一切都有效(并且a-zA-Z没有)here
您还问过如何摆脱结束的空字符串?
String.Split
为您提供了删除空条目的选项,Regex.Split
没有。您的空条目是由于您使用?
作为分割点,因为您要识别要用于分割的非单词字符。您有两个简单的选择:
但是,如果您执行第二个选项,您将最终得到最后一个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”; “是”; “只是”; “疯了”]