如何检测字符串中的特殊字符并修改此特殊字?

时间:2014-08-29 10:37:12

标签: c# string

我有一个字符串,它可能看起来像这样:

asjlfkajs alsdkfja s asldfkjas @abc dfasldkfj asldkfj las @nveweb dfasdlf asldfj.

我想将以@开头的任何单词更改为%@%。例如,

@abc    change to    %@abc%

有人能给我看一个例子吗?我真的不知道它,如何检测以@开头的任何单词,并在每个单词的开头和结尾添加%?

2 个答案:

答案 0 :(得分:3)

也许只是:

str = string.Join(" ", str.Split()
                          .Select(w => w.StartsWith("@") ? "%" + w + "%" : w));

您需要在顶部添加using system.Linq;,因为String.Join的参数是LINQ查询。 String.Split没有参数按white-spaces拆分,包括空格,换行符和制表符。最后,Join将使用空格连接,这意味着您不会保留可能的换行符或制表符。

但是,查询本身会跟随,str.Split()会返回所有"单词"。 Enumerable.Select投影一个字符串,该字符串是原始字符串(如果单词不以@开头)或由%包装的新字符串。

更新,如果您希望保留分隔符,如果它们位于单词的开头或结尾,并且不希望它们也包含在内:

@abc.  --> wrong:  %@abc.% correct: %@abc%.

您可以使用以下方法:

static readonly HashSet<char> WordSeparators = new HashSet<char> { ',', '.', '!', '?', ';', ':', ' ', '-', '/', '\\', '[', ']', '(', ')', '<', '>', '"', '\'' };

static string WrapWithIfStartsWith(string input, string startsWith, string wrap, StringComparison comparison = StringComparison.CurrentCulture)
{
    if (string.IsNullOrEmpty(input) || !input.StartsWith(startsWith, comparison))
        return input;
    else if(input.Length == 1)
        return string.Format("{1}{0}{1}", input, wrap);

    char first = input.First();
    char last = input.Last();
    bool firstIsSeparator = WordSeparators.Contains(first);
    bool lastIsSeparator = WordSeparators.Contains(last);
    if (firstIsSeparator && lastIsSeparator)
        return string.Format("{0}{1}{2}{1}{3}",
            first, wrap, input.Substring(1, input.Length - 2), last);
    else if (firstIsSeparator && !lastIsSeparator)
        return string.Format("{0}{1}{2}{1}",
             first, wrap, input.Substring(1));
    else if (!firstIsSeparator && lastIsSeparator)
        return string.Format("{0}{1}{0}{2}",
            wrap, input.Remove(input.Length - 1), last);
    else
        return string.Format("{1}{0}{1}", input, wrap);
}

现在它很简单:

string str = "blabalbal blabal @abc.";
str = string.Join(" ", str.Split().Select(w => WrapWithIfStartsWith(w,"@","%")));

答案 1 :(得分:-1)

它会有所帮助

string str = "asjlfkajs alsdkfja s asldfkjas @abc dfasldkfj asldkfj las @nveweb dfasdlf asldfj.";
            string[] split = str.Split(' ');
            for(int i = 0; i < split.Length; i++)
            {
                if(split[i].StartsWith("@"))
                {
                    split[i] = "$" + split[i] + "$";
                }
            }
            string result = String.Join(" ", split);
            Console.WriteLine(result);
            Console.ReadLine();