c# - 如何检测字符串中的特殊字符并修改这个特殊单词?

标签 c# string

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

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

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

@abc    change to    %@abc%

谁能给我举个例子吗?我真的不知道如何检测以 @ 开头的单词并在每个此类单词的开头和结尾添加 %?

最佳答案

也许很简单:

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

您需要在顶部添加 using system.Linq;,因为 String.Join 的参数是 LINQ 查询。不带参数的 String.Splitwhite-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,"@","%")));

关于c# - 如何检测字符串中的特殊字符并修改这个特殊单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25566593/

相关文章:

c# - 反转位移运算符/2 的幂

c++ - 在 C++ 中使用 const char* 作为映射键的正确方法

Java - 将单个字符串值与 ArrayList 中的所有字符串值进行比较

string - groovy 中单引号和双引号内的字符串有什么区别?

c# - 在静态方法中访问参数的私有(private)成员?

c# - Xml 文档 - 参数上的 <see> 标记

javascript - 具有最长字符串长度的所有字符串

java - Java 中的这个 log10(int) 方法到底是做什么的?

c# - 更新哈希集中的项目

c# - 在 C# 中绘画有间隙