首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不影响内部空白的情况下裁剪白空间

在不影响内部空白的情况下裁剪白空间
EN

Stack Overflow用户
提问于 2014-09-28 23:46:57
回答 6查看 202关注 0票数 3

我需要修剪空格(包括制表符、换行符等)。来自字符串而不影响内部空白的。例如:

代码语言:javascript
运行
复制
foo
bar
    baz

会变成

代码语言:javascript
运行
复制
foo
bar
    baz

当然,LTRIM / RTRIM是不够的,因为它们只删除空格。这里有几篇文章展示了如何使用REPLACE方法来处理其他字符(例如这一个),但这当然也会删除内部字符。我在这里找不到一个例子来演示如何从字符串中只删除前导和尾随空格字符。

EN

回答 6

Stack Overflow用户

发布于 2014-09-29 06:01:42

SQLCLR很容易处理此功能。您可以编写执行简单String.Trim()的自己的函数,也可以从SQL#库下载已经编写的函数,例如String_Trim()函数。我是SQL#的作者,但是String_Trim函数(和许多其他的函数,包括正则表达式等等)都可以在免费版本中找到。

String_Trim()从字符串的两端移除空格(制表符、换行符、回车和空格),而不触及非空格字符之间的任何空格。如果您复制并粘贴下面的示例代码,您将看到,在非空白字符之前和之后,以及它们之间,是每种类型的空格字符的混合(好吧,标签在这里转换为空格,所以我必须显式地放入制表符中)。

它很简单,如:

代码语言:javascript
运行
复制
PRINT N'~~' + SQL#.String_Trim(N'   ' + NCHAR(9) + N'   
    ' + NCHAR(9) + N'   gfgj    
lf      ' + NCHAR(9) + N'      

g  

' + NCHAR(9) + N'       g        
    ' + NCHAR(9) + N'   ') + N'~~';

输出:

代码语言:javascript
运行
复制
~~gfgj  
lf             

g

    g~~
票数 1
EN

Stack Overflow用户

发布于 2014-09-28 23:46:57

这是我目前的解决方案,但我欢迎其他建议。对于VARCHAR值:

代码语言:javascript
运行
复制
DECLARE @str varchar(8000) , 
        @pat varchar(100) = '%[^ ' + CHAR(9) + '-' + CHAR(13) + ']%';

SET @str = /* load value */

SET @str = SUBSTRING( @str , PATINDEX( @pat , @str ) , 
        DATALENGTH( @str ) - 
        PATINDEX( @pat , @str ) - 
        PATINDEX( @pat , REVERSE( @str )) + 2 );

但是,由于NVARCHAR字符占用2个字节,在这种情况下,需要将DATALENGTH除以2:

代码语言:javascript
运行
复制
DECLARE @str nvarchar(4000) , 
        @pat varchar(100) = '%[^ ' + CHAR(9) + '-' + CHAR(13) + ']%';

SET @str = /* load value */

SET @str = SUBSTRING( @str , PATINDEX( @pat , @str ) , 
        DATALENGTH( @str ) / 2 - 
        PATINDEX( @pat , @str ) - 
        PATINDEX( @pat , REVERSE( @str )) + 2 );

请注意,此处使用的模式(@pat)仅涵盖ASCII字符。这足以满足我的需求,但如果需要完全的Unicode支持,则可以扩展该模式。有关完整列表,请参见维基百科:空白字符

当然,为了便于重用,可以很容易地将其转换为UDF

票数 0
EN

Stack Overflow用户

发布于 2014-09-29 04:49:26

你应该试试这个:

代码语言:javascript
运行
复制
DECLARE @testString varchar(255)
set @testString = 'MY STRING      '

/*I always use this like a final solution*/
SET @testString = REPLACE(REPLACE(REPLACE(@testString, CHAR(9), ''), CHAR(10), ''), CHAR(13), '')
 SELECT @testString   

/*
CHAR(9)       - Tab
CHAR(10) - New Line
CHAR(13) - Carriage Return
*/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26090758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档