我正在努力实现的目标:将字符串拆分为数字、标点符号(除了.和,这些应该在数字部分找到(和字母的单独部分。示例:
情况1:C_TANTALB
Result:
Alpha[]: C, TANTALB
Beta[]:
Zeta[]: _
情况2:BGA-100_T0.8
Result:
Alpha[]: BGA, T
Beta[]: 100, 0.8
Zeta[]: -, _
情况3:C0201
Result:
Alpha[]: C
Beta[]: 0201
Zeta[]:
我找到了这篇文章,但它并不是我的全部工作,因为它在示例1中失败了,甚至没有返回alpha部分。它找不到标点符号。
任何帮助都会得到通知。
如果用IsDigit
和IsLetter
迭代字符串进行测试以使其复杂化,
您可以为此使用Regex:(?<Alfas>[a-zA-Z]+)|(?<Digits>d+)|(?<Others>[^a-zA-Zd])
1/。命名捕获组Alfa(?<Alfas>[a-zA-Z]+)
匹配下面列表中的单个字符[a-zA-Z]+
a-z在a(索引97(和z(索引122(之间的单个字符(区分大小写(
a-z在a(索引65(和z(索引90(之间的一个字符(区分大写(
+
量化器--在一次和无限次之间匹配,尽可能多次,根据需要反馈(贪婪(
2/。命名捕获组数字(?<Digits>[d,.]+)
\d+匹配一个数字(等于[0-9](+
量化器--在一次和无限次之间匹配,尽可能多次,根据需要反馈(贪婪(
3/。命名捕获组其他(?<Others>[^a-zA-Zd]+)
匹配下面列表[^a-zA-Z\d]中不存在的单个字符
a-z在a(索引97(和z(索引122(之间的单个字符(区分大小写(
a-z在a(索引65(和z(索引90(之间的一个字符(区分大写(
\d匹配一个数字(等于[0-9](
+
量化器--在一次和无限次之间匹配,尽可能多次,根据需要反馈(贪婪(
然后获取一个goup值:
var matches = Regex.Matches(testInput, pattern).Cast<Match>();
var alfas = matches.Where(x => !string.IsNullOrEmpty(x.Groups["Alfas"].Value))
.Select(x=> x.Value)
.ToList();
LiveDemo
可能最简单的方法是使用3个单独的正则表达式;每类字符一个。
[A-Za-z]+
用于字母序列- 编号
[d.,]+
- 标点符号
[-_]+
(目前不完整,请随意扩展列表(
示例:
using System;
using System.Linq;
using System.Text.RegularExpressions;
class MainClass
{
private static readonly Regex _regexAlpha = new Regex(@"[A-Za-z]+");
private static readonly Regex _regexBeta = new Regex(@"[d.,]+");
private static readonly Regex _regexZeta = new Regex(@"[-_]+");
public static void Main (string[] args)
{
Console.Write("Input: ");
string input = Console.ReadLine();
var resultAlpha = _regexAlpha.Matches(input).Select(m => m.Value);
var resultBeta = _regexBeta.Matches(input).Select(m => m.Value);
var resultZeta = _regexZeta.Matches(input).Select(m => m.Value);
Console.WriteLine($"Alpha: {string.Join(", ", resultAlpha)}");
Console.WriteLine($"Beta: {string.Join(", ", resultBeta)}");
Console.WriteLine($"Zeta: {string.Join(", ", resultZeta)}");
}
}
样本输出:
Input: ABC_3.14m--nop
Alpha: ABC, m, nop
Beta: 3.14
Zeta: _, --
现场演示:https://repl.it/repls/LopsidedUsefulBucket