【问题标题】:Using regex replace in SSMS 2016 to trim lines在 SSMS 2016 中使用正则表达式替换来修剪线条
【发布时间】:2023-04-28 11:07:03
【问题描述】:

如何使用 SSMS 2016 正则表达式替换功能删除行尾多余的空格和制表符?

编辑器内容示例:

select
    'tab'   
,   'space' 

select
    'tabs'      
,   'spaces'  

目标:

select
    'tab'
,   'space'

select
    'tabs'
,   'spaces'

在 SSMS 2012 中,查找字符串 :b*$ 匹配那些额外的制表符和空格,并允许我将它们替换为空。 SSMS 2016 开始为查找/替换功能使用某种 .net 正则表达式语法。使用 \s+$ 在 2016 年几乎可以使用,但它会删除空行。

【问题讨论】:

  • 尝试使用[\p{Zs}\t]+$
  • [\p{Zs}\t]+$ 匹配最后一行的两个空格,仅此而已。
  • 这意味着你需要用(?m)打开多行模式。 (?m)[\p{Zs}\t]+$

标签: regex ssms regex-greedy ssms-2016


【解决方案1】:

要使用 .NET 正则表达式从 的末尾删除尾随 horizo​​ntal 空格,您需要使用

(?m)[\p{Zs}\t]+$

多行修饰符(?m) 是使$ 锚匹配 的结尾而不是整个字符串所必需的。 \p{Zs} 匹配除制表符之外的任何 Unicode horizo​​ntal 空格,因此,我们需要将 \t\p{Zs} 添加到字符类 [...] 中。 + 量词将匹配这些空格的 1 次或多次出现。

不依赖多行修饰符的替代方案:

[^\S\r\n]+(\r?\n|$)

并替换为$1 反向引用(即由模式中的第一个(也是唯一的)捕获组重新插入文本捕获,即保留结束-输出中的行数)。

详情

  • [^\S\r\n]+ - 匹配除非空格、CR 和 LF 之外的 1 个或多个字符(基本上是 \s\r\n 除外)
  • (\r?\n|$) - 匹配行尾(可选CR、回车强制LF、换行 em>) 或 字符串的末尾 ($)。

【讨论】:

  • (?m)[\p{Zs}\t]+$ 也只匹配最后一行的空格。 SSMS 2016 正则表达式语法可能会受到某种限制。
  • 尝试使用即使在 JavaScript 中也可以工作的捕获组进行替换。 [^\S\r\n]+(\r?\n?) -> $1
  • 查找:[^\S\r\n]+(\r?\n|$),替换为 $1 非常有用,谢谢!
  • @Preza8 这并不意味着答案是错误的,值得一票否决。如果您需要帮助,请发布一个单独的问题,或者至少让其他人帮助您 - 但请准确说明您的输入是什么。当答案格式不正确、不回答问题、仅代码、垃圾邮件时,投反对票是可以的,但事实并非如此。
  • @Preza8 顺便说一句,问题不是换行符,而是水平空格。