【问题标题】:Regex Word splitting in C#C# 中的正则表达式分词
【发布时间】:2011-02-20 10:43:09
【问题描述】:

我知道以前有人问过类似的问题,但我找不到一个和我一样的问题,或者足够像我的问题来帮助我:)。所以基本上我想拆分一个包含一堆单词的字符串,并且我不想返回任何不是单词的字符(这是我正在努力解决的关键问题,忽略字符)。这就是我定义问题的方式:

  1. 构成单词的只是一个任意字符的字符串a-zA-Z (没有数字或其他任何东西)

  2. 在任何单词之间,可以有任意数量的随机其他字符

  3. 我想找回一个只包含单词的string[]

例如:文本:"apple^&**^orange1247pear"

我要返回:apple、orange、pear 的数组。

我想我找到的最接近的是:

Regex.Split("apple^orange7pear",@"([a-zA-Z]*)")

拆分出苹果/橙/梨,但也返回一堆其他垃圾和空白字符串。

有谁知道如何阻止 split 函数返回字符串的某些部分,或者这不可能吗?

提前感谢您给我的任何帮助:)

【问题讨论】:

  • 请注意,您非常限制自己。我一直认为 àèéìòù 是有效的字母 :-)
  • 请提供示例代码。我怀疑您只是在读取错误的结果对象。 :) 要匹配一个单词,请使用 \w+ 而不是指定所有可能的字符。
  • @Tedd OP写的,用*代替+,如果单词之间有多个分隔符,会生成空元素,所以是正确的。
  • @Tedd: \w 包含数字,他想把数字当作分隔符

标签: c# regex


【解决方案1】:

Split 应该与您的单词之间的标记 匹配。在您的正则表达式中,您在单词周围添加了一个组,因此它包含在结果中,但在这种情况下不需要这样做。请注意,此正则表达式匹配任何除了有效单词 - 任何不是 ASCII 字母的内容:

string[] words = Regex.Split(str, "[^a-zA-Z]+");

另一种选择是直接匹配单词:

MatchCollection matches = Regex.Matches(str, "[a-zA-Z]+");
string[] words2 = matches.Cast<Match>().Select(m => m.Value).ToArray();

第二个选项可能更清楚,并且不会在数组的开头或结尾包含空白元素。

【讨论】:

  • 第一个好,第二个不好。您匹配的是分隔符而不是字母。
  • @xanatos - 轻微的复制/粘贴问题。谢谢!
  • @cOrOllArY - 没问题,谢谢!请记住,第一个选项可能会在数组周围创建空元素:"&gt;apple.cider&lt;" -> ["", "apple", "cider", ""]
【解决方案2】:
var splits = Regex.Split("aaa $$$bbb ccc", @"[^A-Za-z]+");

但要包含非拉丁字母,我会使用这个:

var splits = Regex.Split("aaa $$$bbb ccc", @"\P{L}+");

【讨论】:

    【解决方案3】:

    试试这个:

    Regex.Matches("kalle  kula(/()&//()nisse8978971", @"[A-Za-z]+")
    

    使用Matches() 将只收集单词,Split() 将分割不是你想要的字符串。

    【讨论】:

      【解决方案4】:

      Kobi 列出的第二个选项更好,更容易控制。我使用以下正则表达式在字符串中定位常见实体,例如单词、数字、电子邮件地址。

      var regex = new Regex(@"[\p{L}\p{N}\p{M}]+(?:[-.'´_@][\p{L}|\p{N}|\p{M}]+)*", RegexOptions.Compiled);
      

      【讨论】:

        猜你喜欢
        • 2015-12-13
        • 2010-12-20
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多