1

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

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

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

所有字符和数字以及破折号图案化的更好方法是什么?

当我演奏不同的弦时,我还注意到如果最后有一个问号,我会得到一个空弦作为最后的分割部分。我现在只是检查最后一个元素是否为空字符串并将其切断。

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

4

3 回答 3

2

正则表达式 + 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));
于 2013-05-12T17:36:59.450 回答
1

请参阅: MSDN: .NET 风格正则表达式中的字符类:

  • Word 字符语法是\w(该表中的字符类在Unicode Character Database中定义。这与几乎相同a-zA-Z0-9-,但您可能需要使用诸如\p{L}0-9-要排除下划线之类的东西。

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

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

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);
}
于 2013-05-12T17:33:20.340 回答
0

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

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

将匹配变量 txt 中的文本:

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

与: [“弗雷德”;“是”; “只是”; “疯狂的”]

于 2020-08-11T13:19:40.170 回答