收拾一根绳子

时间:2013-06-25 21:04:25

标签: c# regex

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

例如:

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();

感谢所有输入人员 - 证明这是一个很棒的网站

3 个答案:

答案 0 :(得分: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|$)

enter image description here

扩展说明

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

实施例

我不是C#程序员,但是来自代码块的返回数组匹配问题Return a array/list using regex,这个正则表达式可能适合你。请注意,此表达式假定您将使用不区分大小写的选项。

示例文字

\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

答案 1 :(得分:1)

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

http://rubular.com/r/uOVvPTb5nh


看起来你想要允许', s,所以正则表达式:\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());

答案 2 :(得分: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();
}