[英]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 风格正则表达式的正则表达式中的字符类:
\\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);
}
使用 .NET,这只会匹配单词(即使它们是双引号或非字母数字字符的前缀/后缀。
正则表达式(@"[^0-9-!$%^&@#*()_+|~ =`{}[]:;'<>?,./""""""]\\w+")
将匹配变量 txt 中的文本:
var txt = "000 fred is just \"mad:)\"."
与: [“弗雷德”; “是”; “只是”; “疯狂的”]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.