我正在寻找一种快速方法,在第一个字母数字字符后将字符串拆分为两个。
我知道我可以在字符串中创建foreach字符并检查它是数字还是字母数字,但我不知道它是否很快。
例如我有一个字符串“25I10”
我需要将它拆分为25和I10(因为第一个数字可以更小或更大,所以我不能将它分割为0.2。我必须将它拆分为第一个AlphaNumeric字符,因为这是命令启动的地方。
它需要很快,因为我在telnet上获得了很多命令,我不想放慢速度。
是的,我知道我可以将字符串发送到另一个线程而不是拆分它,但我不想为这样的事情创建很多线程。
有谁知道最佳选择?
答案 0 :(得分:3)
int pos = Regex.Match("123abc456", "[a-z]").Index;
您还可以测试您是否匹配:
Match m = Regex.Match("123abc456", "[a-z]");
int pos = -1;
if (m.Success) {
pos = m.Index;
}
模式\p{L}
代替[a-z]
也会匹配来自非英语语言的重音字母。
您也可以直接使用Regex进行拆分:
string[] parts = Regex.Split("123X456", @"\p{L}");
答案 1 :(得分:1)
这是一个可编译的代码,它使用Regex:
using System;
using System.Text.RegularExpressions;
public static class Splitter
{
private static Regex regex;
static Splitter()
{
string separator = "[a-zA-Z]";
string notSeparator = "[^a-zA-Z]";
string pattern = "^(?<left>" + notSeparator + "+)(?<right>" + separator + ".*)$";
regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.ExplicitCapture);
}
public static bool Split(string input, out string left, out string right)
{
var match = regex.Match(input);
if (match.Success && match.Groups["left"].Captures.Count == 1 && match.Groups["right"].Captures.Count == 1)
{
left = match.Groups["left"].Captures[0].Value;
right = match.Groups["right"].Captures[0].Value;
return true;
}
else
{
left = null;
right = null;
return false;
}
}
}
public static class Program
{
public static void Test(string input)
{
string left, right;
if (Splitter.Split(input, out left, out right))
Console.WriteLine("\"" + input + "\" -> \"" + left + "\" + \"" + right + "\"");
else
Console.WriteLine("The string \"" + input + "\" could not be split");
}
public static void Main()
{
Test("2510");
Test("2510I");
Test("I2510");
Test("25I10");
}
}
输出:
The string "2510" could not be split
"2510I" -> "2510" + "I"
The string "I2510" could not be split
"25I10" -> "25" + "I10"
答案 2 :(得分:0)
string str = "10|25";
string[] strArray = System.Text.RegularExpressions.Regex.Split(str, @"(\D.*$)");
它给你的数组长度为3,第一个和第二个元素是你想要的字符串,最后一个元素总是“”。