收拾一根绳子

CSh*_*Bee 5 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();
Run Code Online (Sandbox Code Playgroud)

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

Ro *_* Mi 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
Run Code Online (Sandbox Code Playgroud)

根据您的定义覆盖所有单词字符的字符类将是,[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
Run Code Online (Sandbox Code Playgroud)

火柴

[0] =>  this
[1] =>  is
[2] =>  a
[3] =>  word,
[4] =>  frank's
[5] =>  place
[6] =>  one-hyphen
[7] =>  two-hyphens-here
Run Code Online (Sandbox Code Playgroud)