【问题标题】:Split String At Every Non-Letter/Non-Number Character在每个非字母/非数字字符处拆分字符串
【发布时间】:2020-07-30 20:18:50
【问题描述】:

想象一个包含特殊字符的字符串,例如 $§%%、.、数字和字母。

我想接收任意字符串的字母和数字垃圾作为字符串数组。

一个很好的解决方案似乎是使用正则表达式,但我不知道如何表达[数字和字母]

// example
"abc" = {"abc"};
"ab .c" = {"ab", "c"}
"ab123,cd2,  ,,%&$§56" = {"ab123", "cd2", "56"}

// try
string input = "jdahs32455$§&%$§df233§$fd";
string[] output = input.Split(Regex("makejunksfromstring"));

【问题讨论】:

  • “垃圾”是指“块”?也很难理解你想要什么。您能清楚地写一些您期望的输入示例及其相应的输出吗
  • 我添加了更多更清晰的例子
  • @JNevill 谢谢,但请解释一下您的正则表达式如何尊重数字和字母
  • 在这里查看“单词字符”的解释:docs.microsoft.com/en-us/dotnet/standard/base-types/… \w 匹配单词字符,\W(大写)匹配非单词字符
  • 既然 regex.matches 返回一个集合,你真的要把它变成一个数组吗?也不是拆分,而是返回[A-Za-z0-9]+ 的所有匹配项。看看here

标签: c# regex string


【解决方案1】:

提取您可能使用的 1 个或多个字母/数字的块

[A-Za-z0-9]+   # ASCII only letters/digits
[\p{L}0-9]+    # Any Unicode letters and ASCII only digits 
[\p{L}\p{N}]+  # Any Unicode letters/digits 

查看regex demo

C# usage:

string[] output = Regex.Matches(input, @"[\p{L}\p{N}]+").Cast<Match>().Select(x => x.Value).ToArray();

【讨论】:

  • 最后我也使用了匹配而不是拆分。我使用 [A-Za-z0-9]+ 完成了它,并使用了匹配集合。谢谢你的回答。
【解决方案2】:

是的,正则表达式确实是一个很好的解决方案。

事实上,要匹配输入序列中的所有标准单词,这就是你所需要的:

(\w+)

让我快速解释一下

\w 匹配任何单词字符,相当于 [a-zA-Z0-9_] - 匹配 a 到 z 或 A 到 Z 或 0-9 或 _,您可能想使用 [a-zA-Z0- 9] 来避免使用下划线。

将表达式包装在 () 中意味着您希望将该部分捕获为一个组。

+ 表示您需要 1 个或多个前面字符的序列。

请参阅正则表达式备忘单以查看所有可能性,例如 https://cheatography.com/davechild/cheat-sheets/regular-expressions/

或者你在网上找到的任何东西。

还有一些工具可用于快速测试您的正则表达式,例如 https://regex101.com/(相当可视化的匹配) 或 http://regexstorm.net/tester 专门用于 .NET

【讨论】:

  • * 空格也应该算作“特殊”字符
  • 我使用string s = Regex.Split(s, "([a-zA-Z0-9]+)");,它仍在使用.,.,
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多