5

我正在寻找性能方面的最佳解决方案,通过删除不完整的单词来重建字符串。在这种情况下,可接受的单词是没有数字的完整单词,或者不以正斜杠或反斜杠开头。所以只是字母,但可以包括连字符和撇号

例如:

String str ="\DR1234 this is a word, 123456, frank's place DA123 SW1 :50:/"

使用上面我需要一个返回以下内容的新字符串:

Str = "this is a word, frank's place"

我已经对 进行了一些研究Regex,但找不到任何可以满足我需要的东西。

最终代码片段

var resultSet = Regex.Matches(item.ToLower(), @"(?:^|\s)(?![\\\/])(?!-+(?:\s|$))(?!'+(?:\s|$))(?!(?:[a-z'-]*?-){3,})(?!(?:[a-z'-]*?'){2,})[a-z'-]+[,.]?(?=\s|$)")
                .Cast<Match>()
                .Select(m => m.Value).ToArray();

感谢您的所有投入 - 证明这是一个多么棒的网站

4

3 回答 3

5

描述

根据您的评论:A word in this instance is:

a whole word without numbers 
doesn't start with a forward slash, or a back slash
just letters only
can include hyphen and apostrophes

根据您的定义,涵盖所有单词字符的字符类将是[a-z'-]+,并且该组可以被空格或字符串的开头/结尾包围。您的示例还显示了一个逗号,所以我假设一个单词后面可以跟一个逗号或点,其中任何一个都可以跟空格。

这个正则表达式将:

  • 收集所有定义为单词的子项[a-z'-]+
  • 允许在单词后使用逗号或点,但不能在单词内部或开头
  • 拒绝包含所有连字符的子字符串
  • 拒绝包含所有撇号的子字符串
  • 防止单词有 3 个或更多连字符
  • 防止单词有 2 个或更多撇号

(?:^|\s)(?![\\\/])(?!-+(?:\s|$))(?!'+(?:\s|$))(?!(?:[a-z'-]*?-){3,})(?!(?:[a-z'-]*?'){2,})[a-z'-]+[,.]?(?=\s|$)

在此处输入图像描述

扩展解释

  • (?:^|\s)匹配字符串的开头或空格。这消除了测试单词边界的需要,这对于像“abdc-egfh”这样的字符串是有问题的
  • (?![\\\/])防止单词以 \ 或 / 开头,但是这太过分了,因为字符类也不允许这样做
  • (?!-+(?:\s|$))防止都是连字符的字符串
  • (?!'+(?:\s|$))防止都是撇号的字符串
  • (?!(?:[a-z'-]*?-){3,})防止有 3 个或更多连字符的字符串
  • (?!(?:[a-z'-]*?'){2,})防止有 2 个或更多撇号的字符串
  • [a-z'-]+[,.]?(?=\s|$)匹配后跟一些可选标点符号的单词,并确保其后跟空格或字符串的结尾

例子

我不是 C# 程序员,而是从代码块返回的匹配数组,如问题中所涵盖的返回数组/列表使用正则表达式,这个正则表达式可能对你有用。请注意,此表达式确实假定您将使用不区分大小写的选项。

示例文本

\DR1234 - this is a word, 123456, frank's place DA123 SW1 :50:/  one-hyphen two-hyphens-here I-have-three-hyphens

火柴

[0] =>  this
[1] =>  is
[2] =>  a
[3] =>  word,
[4] =>  frank's
[5] =>  place
[6] =>  one-hyphen
[7] =>  two-hyphens-here
于 2013-06-26T04:09:53.780 回答
1

Regex.Match("[a-z\s,']+")就是你要找的。所以这里是代码示例:

string pattern = "[a-z\s,']+";
string input = @"\DR1234 this is a word, 123456, frank's place DA123 SW1 :50:/";
Match match = Regex.Match(input, pattern);
while (match.Success){
   Console.WriteLine(match.Value);
   match = match.NextMatch();
}
于 2013-06-25T21:22:01.480 回答
1

正则表达式: \b\w+\b将匹配单词,或者如果您更挑剔,\b[a-zA-Z]+\b则不会包含数字或_s

http://rubular.com/r/uOVvPTb5nh


看起来你想允许's 和,s,所以 regex:\b[a-zA-Z,']+\b会做得很好,但它也会让你可能不想要的任何东西漏掉(比如

,','hello''',World

或者,在 C# 中,

string str =@"\DR1234 this is a word, 123456, frank's place DA123 SW1 :50:/";
Regex r = new Regex(@"\b[a-zA-Z,']+\b");

string newStr = string.Join(" ", r.Matches(str).Cast<Match>().Select(m => m.Value).ToArray());
于 2013-06-25T21:15:14.753 回答