繁体   English   中英

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

[英]Removing words with special characters in them

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

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

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

谢谢

添加:

(我想要的例子:)

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

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

所以你想要找到只包含字符az-所有“单词”,对于用空格分隔的单词?

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

(?<!\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 

这个怎么样?

(?<= ^ | \\ S +)([AZ - ] +?)(= $ |?\\ S +)

编辑:Meant (?<=^|\\s+)(?<word>[az\\-]+)(?=(?:\\.|,|!|\\.\\.\\.)?(?:$|\\s+))

规则:

  1. Word只能以行首或一些空白字符开头
  2. Word后面只能跟行结尾或一些空格字符(编辑支持以句点,逗号,感叹号和省略号结尾的单词)
  3. Word只能包含小写(拉丁)字母和短划线

包含每个单词的命名组是“单词”

看看微软的如何:使用正则表达式搜索字符串(C#编程指南) - 它是关于C#中的正则表达式。

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]);
   }
}

这可能是一个起点。 现在它只检查“。” 作为一个特殊的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,"");

您可以通过两种方式执行此操作,即白名单方式和黑名单方式。 使用白名单,您可以定义您认为可接受的字符集,而黑名单则相反。

让我们假设白名单方式,你只接受字符azAZ-字符。 此外,您还有一个规则,即单词的第一个字符不能是大写字符。

有了这个你可以做这样的事情:

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

您可以使用前瞻和后视来执行此操作。 这是一个与你的例子匹配的正则表达式:

(?<=\s|^)[a-z-]+(?=\s|$)

解释是:匹配一个或多个字母字符(仅小写,加连字符),只要字符前面的内容是空格(或字符串的开头),并且只要后面的内容是空格或结尾字符串。

您现在需要做的就是将其插入System.Text.RegularExpressions.Regex.Matches(input, regexString)以获取您的单词列表。

参考: http//www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM