我遇到了字符串解析的问题;我想要实现的是用标记字符串替换值,但字符串匹配需要完美。
请记住,在比较之前我将整个字符串拆分成一个表(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。
答案 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
或者你可以假装它将符号放在你查询中的令牌末尾。
可以在两个表之间搜索LIKE
和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 + '%'
如果您无法更改事实表,则可以伪造更改,在令牌
之后添加符号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:单词的开头或结尾),但它似乎不喜欢§