2014-06-06 63 views
0

我绊倒了一个字符串解析的问题;我试图实现的是用值替换标记字符串,但字符串匹配需要完美。请记住,在比较之前,我将表中的整个字符串(rowID int,segment nvarchar(max))分开,无论我在哪里找到空格,“The delta_s is§delta_s”的内容如下所示:TSQL搜索精确匹配到一个字符串

rowID |段

1 |

2 | deltaT_s

3 |是

4 | §deltaT_s

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

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

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

我使用(因为“之类的指令“是一个失败的原因,因为我可以看到):

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

其中@val是从替换表中取代的数字。现在

,在我的 “替代品” 的表我有2个三角状的标记

1)§deltaT_s

2)§deltaT

我的问题是,当周期开始比较节段和标记,然后§deltaT出现,它将以这种方式替换字符串的第一部分

“§deltaT_s” - >“10_s”

我不明白我在做什么错误的正则表达式的任何人都可以给我和手在这个问题上?

我可用的情况下需要更多信息。

谢谢 F.

+0

我很困惑。如果你一字一句地分开字符串,为什么不用'='来比较呢? –

+0

因为可能会出现字符串也可能是这样的“deltaT_s是§deltaT_s,请参阅ya!” (用标记词旁边的逗号)。当发生分裂时,我会有一个类似'§deltaT_s'的区段,其中正常比较不起作用(afaik)。如果有解决方法,请赐教。谢谢 – user3247900

+0

你为什么不使用REPLACE?例如:SELECT REPLACE(@ segment,@ idString,CAST(@val as NVARCHAR(MAX)) –

回答

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 

,或者您可以伪造它把符号在令牌结束在您查询。

比它的可能的搜索与LIKE替代和两个表

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

如果你不能改变的事实表中可以伪造的变化添加之间的LEFT JOIN符号后的标记

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

对不起,对于迟到的回答,但这是一个很好的接触,避免我REGEX。 谢谢! – user3247900

0

也许这是不是一种选择,但对我帮助的人。

如果您可以在sql中使用正则表达式或创建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:启动或字的结束),但似乎不喜欢§

相关问题