You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正正则表达式以匹配字段大小值?

正则匹配无法获取括号内size值的问题解决

问题描述

我使用以下正则表达式模式:

var pattern = @"\[([^\]]+)\] \[?([^\(\]]+)(?:\((([\w\s]+)\))?\]?.*?(?:\s*NOT\s*NULL)?(?:,|$)";

以及对应的C#代码:

var matches = Regex.Matches(command, pattern, RegexOptions.IgnoreCase);

foreach (Match match in matches)
{
    var fieldName = match.Groups[1].Value.Trim();
    var dataType = match.Groups[2].Value.Trim();
    var sizeStr = match.Groups[3].Value.Trim();
}

但始终获取到null的sizeStr,需要匹配的输入格式示例为:

[field1] [dataType1] (20) nullability, [field2] [dataType2] (max) nullability, [field3] [dataType3] nullability

问题分析

原正则的核心问题在于结构逻辑混乱:

  1. 可选的右括号\]?被错误放置在捕获size的组外部,导致当存在括号内的size时,正则匹配路径出现冲突,无法正确触发Groups[3]的捕获。
  2. 数据类型与size括号的匹配衔接逻辑不清晰,导致正则优先匹配其他内容而非括号内的size值。

修改后的正则表达式

调整正则结构,修正匹配逻辑:

var pattern = @"\[([^\]]+)\] \[?([^\(\]]+)\]?(?:\(([\w\s]+)\))?.*?(?:\s*NOT\s*NULL)?(?:,|$)";

修改说明

  • 将可选右括号\]?移至数据类型捕获组([^\(\]]+)之后,确保数据类型的括号(如果存在)完全匹配后,再处理后续的size括号。
  • 优化size捕获的非捕获组结构:(?:\(([\w\s]+)\))?明确表示这是一个可选的括号包裹块,其中([\w\s]+)专门捕获括号内的size值(支持数字、max等关键字)。

测试验证

使用目标输入字符串测试修改后的正则,Groups[3]将正确输出:

  • 对于[field1] [dataType1] (20) nullability,sizeStr为20
  • 对于[field2] [dataType2] (max) nullability,sizeStr为max
  • 对于[field3] [dataType3] nullability,sizeStr为空字符串(可通过string.IsNullOrEmpty判断)

替代方案(非正则实现)

如果正则调试仍有障碍,可采用更直观的字符串拆分方案,适合结构固定的输入:

var fields = command.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var field in fields)
{
    var parts = field.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    var fieldName = parts[0].Trim('[', ']');
    var dataType = parts[1].Trim('[', ']');
    string sizeStr = null;
    
    if (parts.Length > 2 && parts[2].StartsWith('('))
    {
        sizeStr = parts[2].Trim('(', ')');
    }
    // 后续可添加可空性判断逻辑
}

这种方式代码可读性更高,维护成本更低。

内容的提问来源于stack exchange,提问作者Mohd Arif Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:44:50