SQL Server中的正则表达式

时间:2014-12-22 23:07:26

标签: sql-server regex expression

我有一个包含用户列表的表格,如下所示。

christopher.j.sansom
vinay.prabhakar
Guillaume.de.Miribel (Stage 2B); jean-marie.pierron (Stage 3B)
ian.notley; pavan.sethi
Ron.M.Barbeau
jason.angelos 
jonathan.l.lange, ramesh.t.murti,
nicole.f.cohen

我们可以获得如下记录。需要将逗号分隔的记录作为新行返回。

christopher.j.sansom
vinay.prabhakar
Guillaume.de.Miribel
jean-marie.pierron 
ian.notle
pavan.sethi
Ron.M.Barbeau
jason.angelos 
jonathan.l.lange
ramesh.t.murti
nicole.f.cohen

2 个答案:

答案 0 :(得分:1)

请在此处查看正则表达式:https://regex101.com/r/hD2mQ8/1

您可以使用此模式:

/(^[\w.-]+)|(?<=; |, )[\w.-]+/使用全局和多行修饰符来捕获您需要的文本,但我不确定如何在不查看当前代码的情况下将每个文本返回到新行。

答案 1 :(得分:1)

要做到这一点,你需要一个字符串拆分器查询/功能 这是一个例子,还有其他方法可以做到。

With Normalize AS (
  SELECT REPLACE(CONCAT(REPLACE(names, ',', ';'), ';'), ';;', ';') Names
  FROM   Table1
), Splitter AS (
  Select names String
       , WordCounter = 0
       , NWordStart = 1
       , NWordEnd = CHARINDEX(';', names)
       , Word = CAST('' as nvarchar(255))
       , WordNumber = LEN(names) - LEN(REPLACE(names, ';', '')) + 1
  FROM   Normalize
  UNION ALL
  SELECT s.String
       , WordCounter = s.WordCounter + 1
       , NWordStart = s.NWordEnd + 1
       , NWordEnd = COALESCE(NULLIF(CHARINDEX(';', s.String, NWordEnd + 1), 0)
                           , LEN(s.String) + 1)
       , Word = LTRIM(Cast(SubString(String, s.NWordStart, s.NWordEnd - s.NWordStart) 
                           AS nvarchar(255)))
       , WordNumber = s.WordNumber
  FROM   Splitter s
  WHERE  s.WordCounter + 1 <= s.WordNumber
)
SELECT LEFT(WORD , CHARINDEX(' ', CONCAT(Word, ' ')) - 1) Word
FROM   Splitter
WHERE  Word <> '';

SQLFiddle Demo

CTE标准化将所有分隔符字符更改为;,以便为拆分设置单个分隔符。
CTE拆分器使用;作为分隔符将字符串拆分为块 主查询删除搜索名称和左括号之间空格的阶段信息。