Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Regex仅获取字符串中每个数字的最后一次出现_Sql Server_Regex - Fatal编程技术网

Sql server Regex仅获取字符串中每个数字的最后一次出现

Sql server Regex仅获取字符串中每个数字的最后一次出现,sql-server,regex,Sql Server,Regex,我正在使用SQL Server,遇到了一个我没有答案的情况。详情如下: 例如,给定一个字符串diuuuu,我希望此输出diu。它背后的逻辑是顺序中每个数字(d,i,u)的最后一次出现。其他示例: diudi=udi dididi=di 如能提供正则表达式解决方案,将不胜感激。谢谢大家! 这并不特别漂亮,但它确实起到了作用: WITH VTE AS( SELECT * FROM (VALUES('diudi'),('diuuuu'),('dididi'),('ddddd'))V(Y

我正在使用SQL Server,遇到了一个我没有答案的情况。详情如下:

例如,给定一个字符串
diuuuu
,我希望此输出
diu
。它背后的逻辑是顺序中每个数字(d,i,u)的最后一次出现。其他示例:
diudi
=
udi

dididi
=
di


如能提供正则表达式解决方案,将不胜感激。谢谢大家!

这并不特别漂亮,但它确实起到了作用:

WITH VTE AS(
    SELECT *
    FROM (VALUES('diudi'),('diuuuu'),('dididi'),('ddddd'))V(YourColumn)),
Ranks AS(
    SELECT V.YourColumn,
           CI.C,
           CI.I,
           RANK() OVER (PARTITION BY V.YourColumn ORDER BY CI.I) AS R
    FROM VTE V
         CROSS APPLY (VALUES(REVERSE(V.YourColumn)))R(YourColumn)
         CROSS APPLY (VALUES('d',CHARINDEX('d',R.YourColumn)),
                            ('i',CHARINDEX('i',R.YourColumn)),
                            ('u',CHARINDEX('u',R.YourColumn)))CI(C,I))
SELECT YourColumn,
       REVERSE(CONCAT(MAX(CASE WHEN R = 1 AND I > 0 THEN C END),MAX(CASE WHEN R = 2 AND I > 0 THEN C END),MAX(CASE WHEN R = 3 AND I > 0 THEN C END)))
FROM Ranks
GROUP BY YourColumn;
这应该起作用:

 (.)(?!.*\1)
返回的组连接在一起,可以满足您的需要。

下面是一个SQL答案:

CREATE FUNCTION dbo.udf_LastChars(@str VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN

  DECLARE @result VARCHAR(100)
  DECLARE @char CHAR(1)
  DECLARE @i INT = 1
  WHILE (@i <= LEN(@str))
  BEGIN
    
    SET @char = SUBSTRING(@str, @i, 1)
    SET @result = CONCAT(REPLACE(@result, @char, ''), @char)
    SET @i = @i + 1
  END

  RETURN @result
END
创建函数dbo.udf\u LastChars(@str VARCHAR(100))
返回VARCHAR(100)
作为
开始
声明@result VARCHAR(100)
声明@char(1)
声明@i INT=1

WHILE(@i)这是查找每个字母的最后一次出现。这里的正则表达式逻辑是“忽略所有字符,其中字符串后面有一个相同的字符”可能是以下内容的副本:不。这是T-SQL而不是Regex,它得到了第一个字符……SQL Server使用T-SQL@MPost,而SQL Server本机不支持Regex。这篇文章有点混乱,因为主要问题引用了SQL Server,但标题引用了Regex。不确定这里需要哪个字符。OP在SQL中如何使用它服务器?请求结束:“非常感谢正则表达式解决方案。谢谢!”可能正在开发CLR DLL。我本以为问题已经用C#标记了,因为OP应该包含CLR函数的现有代码。是的,我可以使其更有效,但它易于使用和理解。