【问题标题】:How to remove special characters if it's only at the position of first and last in a string c#如果特殊字符仅位于字符串c#中的第一个和最后一个位置,如何删除它
【发布时间】:2020-03-20 10:09:06
【问题描述】:

如果特殊字符作为字符串的第一个和最后一个字符出现,我会尝试删除它。

代码;

  Regex.Replace(searchParams.SearchForText, @"(\s+|@|%|&|'|\(|\)|<|>|#)", "");

但它会删除特殊字符,即使它位于字符串的中间。

ex : input : $input@text%
     output : input@text

【问题讨论】:

  • 为什么要用正则表达式,只取一个子字符串
  • 如果您知道特价商品可能排在最后,也可能不排在最后。只需检查第一个和最后一个字符,看看它们是否特殊,然后删除它们。
  • 我想你只需要Trim

标签: c# .net regex


【解决方案1】:

你可以使用

var pattern = @"(?:\s+|[@%&'()<>#])";
var result = Regex.Replace(searchParams.SearchForText, $@"^{pattern}|{pattern}$", "");

查看生成的^(?:\s+|[@%&amp;'()&lt;&gt;#])|(?:\s+|[@%&amp;'()&lt;&gt;#])$ regex demo

如果您需要从字符串的开头和/或结尾删除所有这些字符,请使用

var result = Regex.Replace(searchParams.SearchForText, @"^[@%&'()<>#\s]+|[@%&'()<>#\s]+$", "");

this regex demo

在此,请注意,所有单个字符替代品都连接到单个字符类中,以便更有效地搜索。它们不必在字符类中转义,因此模式更加简洁。

接下来,由于\s+ 匹配一个或多个空白字符,它不能与字符类中的单个字符替代合并,因此使用具有替代的非捕获组(?:...|...)

^ 锚点使第一个 ^{pattern} 仅在字符串开始位置匹配,$ 锚点使第二个 {pattern}$ 替代匹配仅在字符串末尾。

由于pattern 应该重复两次,所以它被声明为变量,并且正则表达式是动态构建的。

【讨论】:

  • @Wiktor Stribiżew 它在以下代码“$@”^{pattern}|{pattern}$"" 中显示错误为“expect )”
  • @Zhu 能否请您出示一下sn-p? My code works fine.
  • @Zhu 还有一个建议:Regex.Replace(text.Trim(), @"^[@%&amp;'()&lt;&gt;#]|[@%&amp;'()&lt;&gt;#]$", "") - 修剪输入,然后替换你想要的第一个/最后一个字符,参见another demo。如有必要,再次修剪结果。
  • @Zhu 如果需要在需要删除的字符中添加[],请使用var pattern = @"(?:\s+|[][@%&amp;'()&lt;&gt;#])";@"^[][@%&amp;'()&lt;&gt;#\s]+|[][@%&amp;'()&lt;&gt;#\s]+$"。要删除任何非单词字符和_,请使用@"^[\W_]+|[\W_]+$"。要删除任何标点、符号和空格,请使用@"^[\p{P}\p{S}\s]+|[\p{P}\p{S}\s]+$"
【解决方案2】:
var specialChars = "$@%&'()<>#\u0020".ToCharArray();
var trimmed = "$input@text%".Trim(specialChars);

【讨论】:

  • ToCharArray点赞。我喜欢长序列修剪字符的技巧。
  • .Trim 在开始和结束时删除所有出现的定时字符,而 OP 只需要在字符串的第一个和最后一个位置删除它们。
  • @WiktorStribiżew 可能......但老实说,这个问题在这一点上并不是很清楚。这当然不会将它们从字符串的中间删除。
  • 很明显:我正在尝试删除特殊字符如果它作为字符串的第一个和最后一个字符出现
  • 如果特殊字符出现在字符串的第一个最后一个字符,则删除它?
【解决方案3】:

你可以简单地使用 Trim()

var input = "$input@text%";
var output = input.Trim('@', '%', '$', '\'', '#');

【讨论】:

  • @weichch 你们都忘记了空格修剪。我可以建议将' ''\t' 添加到列表中吗?
  • @Nyerguds Mine 修剪空间看到\u0020,但是是的,标签是另一回事。
  • 我注意到了,但是'\u0020' 是一种相当复杂的写作方式' ' ;)
  • 是的,只是用它来强调那个空间,因为很难在帖子上阅读空间:)
  • .Trim 在开始和结束时删除所有出现的定时字符,而 OP 只需要在字符串的第一个和最后一个位置删除它们。请参阅我正在尝试删除特殊字符如果它作为字符串的第一个和最后一个字符出现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
相关资源
最近更新 更多