删除其中包含特殊字符的单词

时间:2012-05-24 11:32:28

标签: c# regex string

我有一个由许多不同单词组成的长字符串。

我想通过所有这些,如果这个单词包含一个特殊字符或数字(除了' - '),或者以大写字母开头,我想删除它(整个单词不仅仅是那个字符) 。对于所有意图和目的,“外国”字母可以算作特殊字符。

显而易见的解决方案是在每个单词之后运行循环(在拆分之后)然后循环遍历每个字符 - 但是我希望有更快的方法吗?也许使用正则表达式,但我几乎没有经验。

由于

增加:

(我想要的例子:)

输入:“这是来自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)。 ,/ ./!/ ...最后不应该计入'特殊字符'条件(这主要是为了删除网址等)

所以: “我看到一只狗。它是黑色的!” 应该导致 {锯,,狗,是,黑色}

7 个答案:

答案 0 :(得分:2)

您想要查找仅包含字符a-z-的所有“字词”,用于以空格分隔的字词吗?

像这样的正则表达式会找到这样的词:

(?<!\S)[a-z-]+(?!\S)

要允许以单个标点符号结尾的单词,您可以使用:

(?<!\S)[a-z-]+(?=[,.!?:;]?(?!\S))

示例(ideone):

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+))

规则:

  1. Word只能以行首或一些空白字符开头
  2. Word后面只能跟行末尾或一些空格字符(编辑支持以句点,逗号,感叹号和省略号结尾的单词)
  3. Word只能包含小写(拉丁语)字母和短划线
  4. 包含每个单词的命名组是“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-zA-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