用于分割字符串和数字的正则表达式。

18
我有一个形式为:

的字符串:

codename123

有没有一种能够与Regex.Split()一起使用的正则表达式,将字母部分和数字部分分割成为一个包含两个元素的字符串数组?

8个回答

50

我知道你要求使用Split方法,但作为替代方案,你可以使用命名捕获组:

var numAlpha = new Regex("(?<Alpha>[a-zA-Z]*)(?<Numeric>[0-9]*)");
var match = numAlpha.Match("codename123");

var alpha = match.Groups["Alpha"].Value;
var num = match.Groups["Numeric"].Value;

+1 我记得曾经看到过一种解析INI文件的实现方式,我真的觉得非常棒。 - Alex Essilfie
1
如果字母部分和数字部分都必须存在,则正则表达式是不正确的。应该是(?<Alpha>[a-zA-Z]+)(?<Numeric>[0-9]+) - Chris
这个方法适用于像这样的字符串吗?“1/0ACSR”,使其输出为“1/0”和“ACSR”? - Josh P
2
回答了自己的问题: var numAlpha = new Regex("(?<Numeric>[0-9]/[0-9])(?<Alpha>[a-zA-Z])"); - Josh P
2
@FllnAngl - 这个表达式是有顺序的。AlphaNumeric之前。 - Josh
显示剩余2条评论

10
splitArray = Regex.Split("codename123", @"(?<=\p{L})(?=\p{N})");

会在 Unicode 字母和 Unicode 数字之间进行拆分。


5

如果您的字符串始终具有该形式,那么使用正则表达式可能有些繁琐。您可以使用

"codename123".IndexOfAny(new char[] {'1','2','3','4','5','6','7','8','9','0'})

并且有两个Substring的调用。


是的,你的方法快得多。 - user2635088

4
有点啰嗦,但是
Regex.Split( "codename123", @"(?<=[a-zA-Z])(?=\d)" );

您能更具体地说明您的要求吗?也许可以提供一些其他的输入示例。

1
可能会在代码名称中出现反斜杠,但除此之外,如果它能够处理 "code\name123",那么它应该符合我的需求。 - Robert Harvey
1
这将把字符串分割成 codename123 - Tim Pietzcker
@Tim,已更正,谢谢。我忘记了\w匹配字母数字字符,而不仅仅是字母。 - harpo

4

我认为,如果能够找到类似以下的匹配,会更加容易:

Regex.Matches("codename123", @"[a-zA-Z]+|\d+")
     .Cast<Match>()
     .Select(m => m.Value)
     .ToArray();

建议使用Regex.Split代替其他方法。


1

好的,这只有一行代码:Regex.Split("codename123", "^([a-z]+)");


0

这段代码是用Java编写的,逻辑在其他地方应该是相同的。

public String splitStringAndNumber(String string) {
    String pattern = "(?<Alpha>[a-zA-Z]*)(?<Numeric>[0-9]*)";

    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(string);
    if (m.find()) {
        return (m.group(1) + " " + m.group(2));
    }
    return "";
}

0
另一种更简单的方法是:

string originalstring = "codename123";
string alphabets = string.empty;
string numbers = string.empty;

foreach (char item in mainstring)
{
   if (Char.IsLetter(item))
   alphabets += item;
   if (Char.IsNumber(item))
   numbers += item;
}

可能是一个老问题,但这就是正则表达式在幕后所做的事情,虽然以一种高效和优化的方式。 - KMarto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接