把我的大脑放在这个上面。 我有一个字符串,例如MON-123ABC / 456 78#AbCd
我想要的是一个数组或列表如下
[0] = MON
[1] = -
[2] = 123
[3] = ABC
[4] = /
[5] = 456
[6] = ' ' (space character that is between 6 and 7 in the example string)
[7] = 78
[8] = #
[9] = A
[10] = b
[11] = C
[12] = d
当从一种类型的字符(字母,数字,非字母/数字,大写到小写)转换到另一种字符时,我基本上想要分割任何字符串输入
RegExp或C#代码都可以。 我有一个简单的正则表达式0+ |(?< =([1-9]))(?= [1-9])(?!\ 1)但这只是在数字上分开,我的正则表达式不是那个好。我已经使用了一些C#代码来循环使用字符串,但我对字符类型之间的转换有问题。
示例2:另一示例输入字符串可以是123qaz ZBC / 45678#Ab-Cd
它在每次过渡时都在吐痰而不是关键的位置。 在示例2中,顺便提一下z和Z之间有两个空格。 正如我所提到的那样,类型之间的转换是关键。
答案 0 :(得分:1)
有点uggly,分裂在这个正则表达式上:
(?<=[a-z])(?=[^a-z])|(?<=[A-Z])(?=[^A-Z])|(?<=[0-9])(?=[^0-9])|(?<=[a-zA-Z0-9])(?=[^a-zA-Z0-9])|(?<=[^a-z])(?=[a-z])|(?<=[^A-Z])(?=[A-Z])|(?<=[^0-9])(?=[0-9])|(?<=[^a-zA-Z0-9])(?=[a-zA-Z0-9])
<强>详细信息:强>
(?<=[a-z])(?=[^a-z]) : split between lc alpha and not alpha
|(?<=[A-Z])(?=[^A-Z]) : or split between UC alpha and not alpha
|(?<=[0-9])(?=[^0-9]) : or split between digit and not digit
|(?<=[a-zA-Z0-9])(?=[^a-zA-Z0-9]) : or split between alphanum and not alphanum
|(?<=[^a-z])(?=[a-z]) : reverse of above
|(?<=[^A-Z])(?=[A-Z])
|(?<=[^0-9])(?=[0-9])
|(?<=[^a-zA-Z0-9])(?=[a-zA-Z0-9])
它给了我:
("MON", "-", 123, "ABC", "/", 456, " ", 78, "#", "A", "b", "C", "d")
答案 1 :(得分:1)
([A-Z]+|[a-z]+|\d+|[^\da-zA-Z]+)
int i = 0;
foreach(Match match in Regex.Matches(@"MON-123ABC/456 78#AbCd", @"([A-Z]+|[a-z]+|\d+|[^\da-zA-Z]+)"))
{
if (match.Success)
{
Console.WriteLine("{0}\t{1}", ++i, match.Groups[0]);
}
}
有关
1 MON
2 -
3 123
4 ABC
5 /
6 456
7
8 78
9 #
10 A
11 b
12 C
13 d
答案 2 :(得分:1)
这是一个不使用正则表达式的解决方案。
public static IEnumerable<string> SplitOnType(string str)
{
StringBuilder builder = new StringBuilder();
int previousType = -1;
foreach (char c in str)
{
int type;
if ('a' <= c && c <= 'z')
type = 0;
else if ('A' <= c && c <= 'Z')
type = 1;
else if ('0' <= c && c <= '9')
type = 2;
else
type = 3;
if (previousType != -1 && type != previousType)
{
yield return builder.ToString();
builder.Clear();
}
builder.Append(c);
previousType = type;
}
if (builder.Length > 0)
yield return builder.ToString();
}
请注意,这会根据描述将所有非字母数字字符组合在一起,但只需添加其他else if
子句即可更改为进行任何添加分组。
答案 3 :(得分:0)
(?=-|\/|\s|#)|(?<=-|\/|\s|#)|(?!\d)(?=\d)|(?<=\d)(?=[^\d])|(?<=[a-z])|(?=[a-z])
试试这个。参见demo。替换\n