c# - 使用正则表达式匹配属性
问题描述
我有一个这样的字符串代表一组属性,例如:
AB=0,TX="123",TEST=LDAP,USR="",PROPS="DN=VB,XN=P"
我需要在以下位置提取此属性:
- AB=0
- 发送=123
- 测试=LDAP
- USR=
- 道具=DN=VB, XN=P
为了解决这个问题,我尝试使用正则表达式,但没有成功。
public IEnumerable<string> SplitStr(string input)
{
Regex reg= new Regex("((?<=\")[^\"]*(?=\"(,|$)+)|(?<=,|^)[^,\"]*(?=,|$))", RegexOptions.Compiled);
foreach (Match match in reg.Matches(input))
{
yield return match.Value.Trim(',');
}
}
我找不到预期输出的理想正则表达式。使用上述正则表达式,输出为:
- AB=0
- 123
- 测试=LDAP
- DN=VB, XN=P
任何人都可以帮助我吗?
解决方案
您可以使用
public static IEnumerable<string> SplitStr(string input)
{
var matches = Regex.Matches(input, @"(\w+=)(?:""([^""]*)""|(\S+)\b)");
foreach (Match match in matches)
{
yield return string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim();
}
}
正则表达式详细信息:
(\w+=)
- 第 1 组:一个或多个单词字符和一个=
字符(?:""([^""]*)""|(\S+)\b)
- 匹配以下两种选择之一的非捕获组:"([^"]*)"
- a"
,然后是 0 个或多个字符"
,然后是 a"
|
- 或者(\S+)\b
- 除空格之外的任何 1+ 字符,尽可能多,直到单词边界位置。
请参阅正则表达式演示。
该string.Concat(match.Groups.Cast<Group>().Skip(1).Select(x => x.Value)).Trim()
代码从组中省略了 Group 0(全匹配)值,获取 Group 1、2 和 3 并将它们连接成一个字符串,然后对其进行修剪。
var s = "AB=0, TX=\"123\", TEST=LDAP, USR=\" \", PROPS=\"DN=VB, XN=P\"";
Console.WriteLine(string.Join("\n", SplitStr(s)));
输出:
AB=0
TX=123
TEST=LDAP
USR=
PROPS=DN=VB, XN=P
推荐阅读
- javascript - 为什么 yarn 在安装特定包时会发出以下请求?
- bash - 三个反引号的 Shell STDIN 重定向
- android - 有没有办法在 android WorkManager 中定期执行一系列工作项
- android - 我从我的 android 应用程序中保存的 jpeg 图像并不完全清晰
- kubernetes - 如何将 SQLite 数据库放在 NFS 持久卷之外
- sql-server - 在部署前和部署后脚本 SSDT 中访问构建变量
- json - 通过 bash 中的 JQ 命令将 JSON 转换为 CSV
- delphi - Delphi 10.3 RIO ImageList 导致 Android 5.1.1 崩溃
- python - 具有多个输入的 Dash 输出
- assembly - 如何正确使用 ADDIS 和 ADDI 将 32 位常量直接求和到寄存器?