TSQL搜索完全匹配成一个字符串

时间:2014-06-06 08:31:20

标签: sql-server regex string tsql replace

我遇到了字符串解析的问题;我想要实现的是用标记字符串替换值,但字符串匹配需要完美。

请记住,在比较之前我将整个字符串拆分成一个表(rowID int,segment nvarchar(max)),无论我在哪里找到一个空格,所以像'delta_sis§delta_s'这样的东西将如下所示: / p>

  

rowID |分段

     

1 |

     

2 | deltaT_s

     

3 |是

     

4 | §deltaT_s

在此之后我用我的“替换”表(idString nvarchar(max),val float)循环每一行;例如:

  

标记字符串(@segment):'§deltaT_s'

     

要替换的字符串(@idString):'§deltaT_s'

我正在使用的指令(因为“喜欢”是我看不见的原因):

SELECT STUFF(@segment, PATINDEX('%'+@idString+'[^a-z]%', @segment), LEN(@idString), CAST(@val AS NVARCHAR(MAX)))

@val是要从“替换”表中取代的数字。

现在,在我的“替换”表中,我有2个delta标记

  

1)§deltaT_s

     

2)§deltaT

我的问题是,当循环开始比较片段与标记并且§deltaT出现时,它将以这种方式替换字符串的第一部分

  

'§deltaT_s' - > '10_s'

我不明白我对REGEX做错了什么,任何人都可以给我并提出这个问题?

如果需要更多信息,我可以使用。

谢谢你, F。

2 个答案:

答案 0 :(得分:1)

如果可能,您应该更改标记样式,在标记的两侧放置一个段落符号(§),在评论中添加一个示例

the deltaT_s is §deltaT_s§, see ya!

这样做的句子将被分割为

rowID | segment
--------------------
    1 | the
    2 | deltaT_s
    3 | is
    4 | §deltaT_s§,
    5 | see
    6 | ya!

如果替换值存储在事实表中,您将具有类似

的内容
token      | value
------------------
§deltaT§   | foo
§deltaT_s§ | 10

或者你可以假装它将符号放在你查询中的令牌末尾。

可以在两个表之间搜索LIKELEFT JOIN的替换

SELECT COALESCE(REPLACE(segment, t.token, t.value), segment) Replaced
FROM   Sentence s
       LEFT JOIN Token t ON s.segment LIKE '%' + t.token + '%'

SQLFiddle demo

如果您无法更改事实表,则可以伪造更改,在令牌

之后添加符号
SELECT COALESCE(REPLACE(segment, t.token, t.value), segment) Replaced
FROM   Sentence s
       LEFT JOIN Token t ON s.segment LIKE '%' + t.token + '§%'

答案 1 :(得分:0)

也许这不是一个选择,但对我来说有帮助。

如果您可以在sql中使用Regex或创建CLR函数,请查看此链接http://www.sqllion.com/2010/12/pattern-matching-regex-in-t-sql/最后2个选项。

对你来说,最好的选择是使用CLR功能。

然后你可以这样做:

文字:the deltaT_s is §delta, see ya!

正则表达式:(?<=[^a-z])§delta(?![a-z_]) - 此(?<=[^a-z])表示不会匹配,(?![a-z_])后面没有字母和下划线。

替换为:10

我也尝试了正则表达式\b§delta\b(\ b:单词的开头或结尾),但它似乎不喜欢§