Regex可选分组括号之间的文本,但不包括结果中的括号

Regex可选分组括号之间的文本,但不包括结果中的括号,regex,Regex,对于在某个时刻解释数据定义文本的应用程序,我想使用regex。正则表达式应该为每行将数据定义分成4个组 问题是,括号之间有一个组,但它也是可选的,应该从结果中排除括号。我一直在尝试一些东西,但不能完全让它发挥作用 这就是我到目前为止得到的 \[(.*?)\]\s.*(varchar|datetime|int|numeric)(\(.*?\))?(.*) # explanation \[(.*?)\] # field name between brac

对于在某个时刻解释数据定义文本的应用程序,我想使用regex。正则表达式应该为每行将数据定义分成4个组

问题是,括号之间有一个组,但它也是可选的,应该从结果中排除括号。我一直在尝试一些东西,但不能完全让它发挥作用

这就是我到目前为止得到的

\[(.*?)\]\s.*(varchar|datetime|int|numeric)(\(.*?\))?(.*)

# explanation
\[(.*?)\]                       # field name between brackets
\s.*                            # one or more spaces
(varchar|datetime|int|numeric)  # data type keywords
(\(.*?\))?                      # length or mask, ?=optional
(.*)                            # anything after that are the hints
例如,输入它是这样的

[LastName] varchar(50) NULL
[BirthDate] datetime(dd-mm-yyyy) NOT NULL
[HBa] numeric NOT NULL
[email] varchar(50) NOT NULL
[Followup] int NULL
每行都有一个匹配项,例如
生日的结果如下:

# current                   # desired
group 1: BirthDate          group 1: BirthDate
group 2: datetime           group 2: datetime
group 3: (dd-mm-yyyy)       group 3: dd-mm-yyyy
group 4:  NOT NULL          group 4: NOT NULL
理想情况下,第3组应排除括号,第4组也不应包括开头的空格。你知道怎么做吗?请参见此处的示例:

我们应该做到这一点。我所做的唯一调整是

  • 添加非捕获组,并反转
    (50)
    匹配的文字括号和捕获组
  • 添加
    \s*
    以在
    (50)
    组和行的其余部分(
    非NULL
    组)之间使用空格

  • 只需将第三个捕获组替换为非捕获组,并在括号内使用捕获组。例如,
    (?:\(.*?)?
    而不是
    (\(.*)?
    。谢谢,我只想提到我有一个类似的正则表达式,用于
    CountPrint int NULL
    ,起初因为列名中的
    int
    而不起作用。正则表达式没有显式检查空格,所以我将
    \s.*
    替换为
    \s+
    ,然后它就可以工作了。
    \[(.*?)\]\s.*(varchar|datetime|int|numeric)(?:\((.*?)\))?\s*(.*)