首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个特殊字符替换为单个破折号

将多个特殊字符替换为单个破折号
EN

Stack Overflow用户
提问于 2018-05-22 10:57:02
回答 2查看 288关注 0票数 1

嗨,我的数据是(围巾。)/(包装),我想把它显示为围巾包装,但我无法得到它。

我下面的代码如下

代码语言:javascript
复制
DECLARE @str VARCHAR(400)
DECLARE @specialchars VARCHAR(50) = '%[/,~,@,#,$,%,&,*,(,),.,!^?:]%'
--SET @str = 'KRA!NTHI@#KUMAR, KU%^?MAR GO~()$U.BigGrin'
SET @str = '(SCARF.) / (WRAPS)'
SET @str = REPLACE(@str,'.','')
WHILE PATINDEX( @specialchars, @str ) > 0
SET @str = REPLACE(REPLACE( @str, SUBSTRING( @str, PATINDEX( @specialchars, @str ), 1 ),'-'),'-','-')

IF(LEFT(@str, 1) = '-')
   set @str = RIGHT(@str, LEN(@str) - 1)
IF(RIGHT(@str, 1) = '-')
   set @str = LEFT(@str, LEN(@str) - 1)

SELECT REPLACE(@str,' ','-')

但是它给出的数据是围巾--包装而不是围巾--包装。

我有像多重这样的数据类型,我想把它们转换成单个破折号。

例如:

“护肤美容供应”应改为“护肤美容供应”。 “BANDANAS/榴弹炮/包装”应改为“BANDANAS/BANDANAS/WRAPS” “HATS&消声器”应该改为“帽子-消声器”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-22 14:25:12

试试这个:

代码语言:javascript
复制
DECLARE @str VARCHAR(400)='(SCARF.) / (WRAPS)'
DECLARE @specialchars VARCHAR(50) = '%[/,~,@,#,$,%,&,*,(,),.,!^?:-]%'

WHILE PATINDEX( @specialchars, @str ) > 0
SET @str = REPLACE( @str, SUBSTRING( @str, PATINDEX( @specialchars, @str ), 1 ),' ')

SELECT REPLACE(REPLACE(REPLACE(RTRIM(LTRIM(@str)), ' ', '- '), ' -', ''), ' ', '')
票数 0
EN

Stack Overflow用户

发布于 2018-05-22 11:46:10

我不会说这个解决方案很漂亮;它不是。它能完成这项工作,但我不指望它能很快奏效。它利用了Alan的NGrams8k,因此您也需要确保服务器上有一个副本。

如果您不理解它,可以自由地问(除了NGrams8K是如何工作的,这就是本文的目的):

代码语言:javascript
复制
CREATE TABLE T (string varchar(400));
INSERT INTO T
VALUES ('KRA!NTHI@#KUMAR, KU%^?MAR GO~()$U.BigGrin'),
       ('(SCARF.) / (WRAPS)');
GO
WITH Replacements AS (
    SELECT *,
           CASE WHEN NG.token NOT LIKE '[ /,~@#$%&*().!^?:]' THEN NG.token ELSE '-' END AS TokenR
    FROM T
         CROSS APPLY dbo.NGrams8k ('-'+T.String+'-',1) NG),
Repeating AS (
    SELECT *,
           CASE WHEN TokenR = '-' AND TokenR = LAG(TokenR) OVER (PARTITION BY string ORDER BY position) THEN NULL ELSE TokenR END AS TokenRR
    FROM Replacements),
Cleaned AS (
    SELECT string,
           STUFF((SELECT sq.TokenRR + ''
                  FROM Repeating sq
                  WHERE sq.TokenRR IS NOT NULL
                    AND sq.string = R.string
                  ORDER BY position
                  FOR XML PATH('')),1,1,'') AS CleanString
    FROM Repeating R
    GROUP BY string)
SELECT string, LEFT(CleanString, LEN(CleanString)-1) AS CleanedString
FROM Cleaned;

GO
DROP TABLE T;

通过提供示例数据,您可以得到以下输出:

代码语言:javascript
复制
string                                     | CleanedString
-------------------------------------------|---------------------------------
(SCARF.) / (WRAPS)                         | SCARF-WRAPS
KRA!NTHI@#KUMAR, KU%^?MAR GO~()$U.BigGrin  | KRA-NTHI-KUMAR-KU-MAR-GO-U-BigGrin
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50465978

复制
相关文章

相似问题

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