正则表达式在C#中拆分

时间:2011-02-20 10:43:09

标签: c# regex

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

  1. 单词的构成仅为任何字符a-zA-Z的字符串 (没有数字或其他任何东西)

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

  3. 我想找回仅包含

  4. 字样的string[]

    例如:text:"apple^&**^orange1247pear"

    我想要返回:数组中的苹果,橙子,梨。

    我发现我最接近的是:

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

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

    任何人都知道如何停止拆分函数返回字符串的某些部分,或者这是不可能的?

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

4 个答案:

答案 0 :(得分:5)

拆分应与之间的标记匹配。在你的正则表达式中,你在单词周围添加了一个组,因此它包含在结果中,但在这种情况下不需要。请注意,此正则表达式匹配除了有效单词之外的任何内容 - 任何非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();

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

答案 1 :(得分:2)

var splits = Regex.Split("aaa $$$bbb ccc", @"[^A-Za-z]+");

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

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

答案 2 :(得分:0)

试试这个:

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

使用Matches()只会收集字词,Split()会划分不符合您要求的字符串。

答案 3 :(得分:0)

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

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