繁体   English   中英

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

[英]How to match only words using regex?

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

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

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

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

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

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

正则表达式 + 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));

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

编辑:并且,作为参考,有一篇文章解释了为什么这一切都有效(而 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);
}

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

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

将匹配变量 txt 中的文本:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM