我有一个由许多不同单词组成的长字符串。
我想通过所有这些,如果这个单词包含一个特殊字符或数字(除了' - '),或者以大写字母开头,我想删除它(整个单词不仅仅是那个字符) 。对于所有意图和目的,“外国”字母可以算作特殊字符。
显而易见的解决方案是在每个单词之后运行循环(在拆分之后)然后循环遍历每个字符 - 但是我希望有更快的方法吗?也许使用正则表达式,但我几乎没有经验。
由于
增加:
(我想要的例子:)
输入:“这是来自example.com的输入中的5个单词的示例”
输出:{this,an,of,words,in,an,input,like-so,from}
(到目前为止我尝试过的)
List<string> response = new List<string>();
string[] splitString = text.Split(' ');
foreach (string s in splitString)
{
bool add = true;
foreach (char c in s.ToCharArray())
{
if (!(c.Equals('-') || (Char.IsLetter(c) && Char.IsLower(c))))
{
add = false;
break;
}
if (add)
{
response.Add(s);
}
}
}
编辑2:
对我来说,一个单词应该是一个由空格分隔的多个字符(a..z)。 ,/ ./!/ ...最后不应该计入'特殊字符'条件(这主要是为了删除网址等)
所以: “我看到一只狗。它是黑色的!” 应该导致 {锯,,狗,是,黑色}
答案 0 :(得分:2)
您想要查找仅包含字符a-z
或-
的所有“字词”,用于以空格分隔的字词吗?
(?<!\S)[a-z-]+(?!\S)
要允许以单个标点符号结尾的单词,您可以使用:
(?<!\S)[a-z-]+(?=[,.!?:;]?(?!\S))
var re = @"(?<!\S)[a-z-]+(?=[,.!?:;]?(?!\S))";
var str = "this, Is an! Example of 5 words in an input like-so from example.com foo: bar?";
var m = Regex.Matches(str, re);
Console.WriteLine("Matched: ");
foreach (Match i in m)
Console.Write(i + " ");
注意字符串中的标点符号。
输出:
Matched:
this an of words in an input like-so from foo bar
答案 1 :(得分:1)
这个怎么样?
(小于?= ^ | \ S +)(?[A-Z - ] +)(?= $ | \ S +)
修改:意见(?<=^|\s+)(?<word>[a-z\-]+)(?=(?:\.|,|!|\.\.\.)?(?:$|\s+))
规则:
包含每个单词的命名组是“word”
答案 2 :(得分:0)
看看微软的How to: Search Strings Using Regular Expressions (C# Programming Guide) - 它是关于C#中的正则表达式。
答案 3 :(得分:0)
List<string> strings = new List<string>() {"asdf", "sdf-sd", "sdfsdf"};
for (int i = strings.Count-1; i > 0; i--)
{
if (strings[i].Contains("-"))
{
strings.Remove(strings[i]);
}
}
答案 4 :(得分:0)
这可能是一个起点。现在它只检查“。”作为一个特殊的char。这输出:“这是一个类似的词 - 来自”
string pattern = @"[A-Z]\w+|\w*[0-9]+\w*|\w*[\.]+\w*";
string line = "this Is an Example of 5 words in an in3put like-so from example.com";
System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(pattern);
line = r.Replace(line,"");
答案 5 :(得分:0)
您可以通过两种方式执行此操作:白名单方式和黑名单方式。使用白名单,您可以定义您认为可接受的字符集,而黑名单则相反。
让我们采用白名单方式,并且只接受字符a-z
,A-Z
和-
字符。另外,你有一个规则,即单词的第一个字符不能是大写字符。
有了这个,你可以这样做:
string target = "This is a white-list example: (Foo, bar1)";
var matches = Regex.Matches(target, @"(?:\b)(?<Word>[a-z]{1}[a-zA-Z\-]*)(?:\b)");
string[] words = matches.Cast<Match>().Select(m => m.Value).ToArray();
Console.WriteLine(string.Join(", ", words));
输出:
// is, a, white-list, example
答案 6 :(得分:0)
您可以使用前瞻和后视来执行此操作。这是一个与你的例子匹配的正则表达式:
(?<=\s|^)[a-z-]+(?=\s|$)
解释是:匹配一个或多个字母字符(仅小写,加连字符),只要字符前面的内容是空格(或字符串的开头),并且只要后面的内容是空格或字符串的结尾。
您现在需要做的就是将其插入System.Text.RegularExpressions.Regex.Matches(input, regexString)
以获取您的单词列表。
参考:http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet