首页 > 解决方案 > 括号之间的正则表达式可选组文本,但在结果中排​​除括号

问题描述

对于在某些时候解释数据定义文本的应用程序,我想使用正则表达式。正则表达式应将每行的数据定义分成 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

每行都有一个匹配项,例如结果BirthDate如下:

# 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 组也不应在开头包含空格。知道怎么做吗?请参见此处的示例: https ://regex101.com/r/x60Ekg/1

标签: regex

解决方案


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

应该做的伎俩。我所做的唯一调整是

  1. 添加非捕获组并反转文字括号和捕获组以进行(50)匹配。
  2. 在组和行的其余部分(组)之间添加\s*吃空间。(50)NOT NULL

推荐阅读