在逗号上匹配组

时间:2016-08-10 10:44:14

标签: regex

我有这样的字符串,结构如下:

somevalue, secondvalue, thirdvalue

总会有三个值,它们将以逗号分隔。 他们自己的实际值也可能包含, s。

我使用此结构的一些数据示例:

app.weeks = 999, 999, app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7)

app.weeks = 999是一整个值,后跟,999是一个完整的值,后跟,

app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7)是另一个值。

以此字符串为例,并使用上述结构。

请记住,这些价值观并不固定,并不总是能够说明“app.weeks = 999}'

我想将其分为三个部分。

matches (
    $1: app.weeks = 999
    $2: 999
    $3: app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7)
)

可以按任何顺序排列:

999, app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7), app.weeks = 999

app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7), app.weeks = 999, 999

或组合:

app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7), app.weeks = 999, app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7)

在这种情况下,它仍然需要匹配:

matches (
    $1: app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7)
    $2: app.weeks = 999
    $3: app.weeks - FLOOR(DATEDIFF(DAY, GETDATE(), app.register) / 7)
)

以上是申请的要求。

这是我的尝试:

^(.+,)(.+,)(.+)$

但它与任何东西都不匹配。我的正则表达式应该是什么?

在旁注中,此要求的背景是我正在尝试将MYSQL IF语句动态转换为TSQL Case语句。

1 个答案:

答案 0 :(得分:1)

感谢您澄清问题。

基本上你想要找到的是逗号之间不在括号内的所有内容。

正则表达式

(?<capture>[^,()]+(?<par>\((?:[^()]*(?&par)*)*\))?)

应该这样做。

请注意,它会将数据拆分为两个标记:

  • 捕获:这是您要求的数据
  • par:这是可能存在的括号,它用于正则表达式中的递归,但对你来说应该是无趣的。

In action