描述
部分问题在于\w
它还包括所有字母 az、所有数字 0-9 和下划线_
。因此,如果您的输入文本可以使用_
分隔符,那么表达式匹配\w+
将变得混乱
因为您需要允许下划线作为分隔符,所以我建议\w
您不要使用简写,而是为所需的文本和分隔符定义您想要的字符类。
[0-9a-zA-Z]+
将以任何顺序匹配一个或多个字母或数字
[^a-zA-Z0-9]
这是一个否定字符类,将匹配任何不是字母或数字的字符
此正则表达式将匹配所有值,并允许使用广泛的分隔符。
^(?<pol>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<fac>[0-9a-zA-Z]+\s[0-9a-zA-Z]+-[0-9a-zA-Z]+)[^a-zA-Z0-9](?<end>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<op>[0-9a-zA-Z]+)
团体
为了匹配fac
组,我假设该字段将采用以下格式:字母空格数字连字符数字。
- 第 0 组将获得整个匹配的字符串
- 将创建命名组,但是在图像 1=pol、2=fac、3=end 和 4=op 中。很抱歉绘图软件无法处理命名的捕获组。
C# 代码示例:
输入文本
12_B 99-23_9_23
11_a 11-11_1_11
22|b 22-22|2|22
33-c 33-33-3-33
44,d 44-44,4,44
代码
using System;
using System.Text.RegularExpressions;
namespace myapp
{
class Class1
{
static void Main(string[] args)
{
String sourcestring = "source string to match with pattern";
Regex re = new Regex(@"^(?<pol>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<fac>[0-9a-zA-Z]+\s[0-9a-zA-Z]+-[0-9a-zA-Z]+)[^a-zA-Z0-9](?<end>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<op>[0-9a-zA-Z]+)",RegexOptions.IgnoreCase | RegexOptions.Multiline);
MatchCollection mc = re.Matches(sourcestring);
int mIdx=0;
foreach (Match m in mc)
{
for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
{
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
}
mIdx++;
}
}
}
}
火柴
$matches Array:
(
[0] => Array
(
[0] => 12_B 99-23_9_23
[1] => 11_a 11-11_1_11
[2] => 22|b 22-22|2|22
[3] => 33-c 33-33-3-33
[4] => 44,d 44-44,4,44
)
[pol] => Array
(
[0] => 12
[1] => 11
[2] => 22
[3] => 33
[4] => 44
)
[fac] => Array
(
[0] => B 99-23
[1] => a 11-11
[2] => b 22-22
[3] => c 33-33
[4] => d 44-44
)
[end] => Array
(
[0] => 9
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
[op] => Array
(
[0] => 23
[1] => 11
[2] => 22
[3] => 33
[4] => 44
)
)