我正在寻找最佳解决方案,性能明智,通过删除不完整单词的单词来重建字符串。在这个例子中,一个可接受的单词是一个没有数字的整个单词,或者不是以正斜杠或反斜杠开头。所以只是字母,但可以包括连字符和撇号
例如:
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();
感谢所有输入人员 - 证明这是一个很棒的网站
答案 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'-]+
(?:^|\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#程序员,但是来自代码块的返回数组匹配问题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();
}