如何在SQL Server中使用正则表达式

2025-03-23 18:16:09
推荐回答(4个)
回答1:

sqlserver中,主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四个正则表达式函数。
1、regexp_like:
regexp_like(x,pattern[,match_option]),查看x是否与pattern相匹配,该函数还可以提供一个可选的参数match_option字符串说明默认的匹配选项。match_option的取值如下:
'c'
说明在进行匹配时区分大小写(缺省值);
'i'
说明在进行匹配时不区分大小写;
'n'
(.)点号能表示所有单个字符,包括换行(俺还不知道什么地方有用到换行.只知道sql里面可以用chr(10)表示换行、
'm'
字符串存在换行的时候当作多行处理.这样$就可匹配每行的结尾.不然的话$只匹配字符串最后的位置、
示例:
select
*
from
emp
where
regexp_like(ename,'^a[a-z]*n$');
可以查找ename中以a开头以n结尾的行.例如ename为arwen或arwin或anden.但Arwen不能被匹配.因为默认是区分大小写.如果是
select
*
from
emp
where
regexp_like(ename,'^a[a-z]*n$','i')
则可以查找ename为Arwen的行记录。
2、regexp_instr:
REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[,
match_option]]]])用于在x中查找pattern。返回pattern在x中出现的位置。匹配位置从1开始。可以参考字符串函数
INSTR(),参数相关:
'start'
开始查找的位置;
'occurrence'
说明应该返回第几次出现pattern的位置;
'return_option'
说明应该返回什么整数。若该参数为0,则说明要返回的整数是x中的一个字符的位置;若该参数为非0的整数,则说明要返回的整数为x中出现在pattern之后
的字符的位置;
'match_option'
修改默认的匹配设置.与regexp_like里面的相同.
示例:
DECLARE
V_RESULT
INTEGER
;
BEGIN
SELECT
REGEXP_INSTR('hello
world','o',1,1,0)
INTO
V_RESULT
FROM
DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
结果为5,即字母o第一个次出现的位置。
如果regexp_instr('hello
world','o',1,1,n)其中n为除0之外的整数。比如1,3。则结果为6.表示第一次出现字母o的后面一个字符的位置。
如果regexp_instr('hello
world','o',1,2,0)则结果为9.表示第二次出现字母o的位置.
3、regexp_replace:
REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[,
match_option]]]])用于在x中查找pattern,并将其替换为replae_string。可以参考字符串函数
REPLACE(),参数同REGEXP_INSTR函数
示例:
DECLARE
V_RESULT
varchar2(90);
BEGIN
SELECT
REGEXP_REPLACE('hello
world','o','x',1,1)
INTO
V_RESULT
FROM
DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
结果为hellx
world.
如果REGEXP_REPLACE('hello
world','o','x'),则结果为hellx
wxrld.
如果
REGEXP_REPLACE('hello
world','o','x',1,2)则结果为hello
wxrld.
4、regexp_substr:
REGEXP_SUBSTR(x,pattern[,start[,occurrence[,
match_option]]])用于在x中查找pattern并返回。可以参考字符串函数
SUBSTR(),参数同REGEXP_INSTR函数.
例如:
DECLARE
V_RESULT
VARCHAR2(255);
BEGIN
SELECT
REGEXP_SUBSTR('hello
world','l{2}')
INTO
V_RESULT
FROM
DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END
;
结果为ll
查询到匹配的字符串才返回匹配的字符.没查到就返回空。

回答2:

Create Function [dbo].[IsMatch](@Reg Varchar(1000),@Source Varchar(4000))
returns sql_variant
As
Begin
Declare @Err Int
Declare @obj Int
Declare @Rst sql_variant

EXEC @Err=Sp_OACreate 'VBScript.RegExp',@obj OUTPUT
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Pattern',@Reg
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Global','True'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'IgnoreCase','False'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OAMethod @obj,'Test',@Rst OUTPUT,@source
If @Err<>0 GoTo LB

EXEC @Err=Sp_OADestroy @obj
If @Err<>0 GoTo LB

Return @Rst
LB:
EXEC Sp_OADestroy @obj
RETURN Null
End

--字符串匹配的
Select dbo.IsMatch('\d','12345')

Create Function [dbo].[MyReplace](@Reg Varchar(1000),@Source Varchar(4000),@Str Varchar(1000))
returns sql_variant
As
Begin
Declare @Err Int
Declare @obj Int
Declare @Rst sql_variant

EXEC @Err=Sp_OACreate 'VBScript.RegExp',@obj OUTPUT
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Pattern',@Reg
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Global','True'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'IgnoreCase','False'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OAMethod @obj,'Replace',@Rst OUTPUT,@source,@Str
If @Err<>0 GoTo LB

EXEC @Err=Sp_OADestroy @obj
If @Err<>0 GoTo LB

Return @Rst
LB:
EXEC Sp_OADestroy @obj
RETURN Null
End
--字符串替换的
select dbo.MyReplace('\d','123A454','')

--字符串提取的,这种方法不会搞
--这两个函数需要开启Ole Automation Procedures配置
/*
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ole Automation Procedures',1
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
*/
--CLR的匹配,查找,截取,统计,分割和提取代码我也有,不知道你要不要

回答3:

--SQL版
Create Function MyReplace(@Reg Varchar(1000),@Source Varchar(4000),@Str Varchar(1000))
returns sql_variant
As
Begin
Declare @Err Int
Declare @obj Int
Declare @Rst sql_variant

EXEC @Err=Sp_OACreate 'VBScript.RegExp',@obj OUTPUT
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Pattern',@Reg
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Global','True'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'IgnoreCase','False'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OAMethod @obj,'Replace',@Rst OUTPUT,@source,@Str
If @Err<>0 GoTo LB

EXEC @Err=Sp_OADestroy @obj
If @Err<>0 GoTo LB

Return @Rst
LB:
EXEC Sp_OADestroy @obj
RETURN Null
End

Create Function IsMatch(@Reg Varchar(1000),@Source Varchar(4000))
returns sql_variant
As
Begin
Declare @Err Int
Declare @obj Int
Declare @Rst sql_variant

EXEC @Err=Sp_OACreate 'VBScript.RegExp',@obj OUTPUT
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Pattern',@Reg
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'Global','True'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OASetProperty @obj,'IgnoreCase','False'
If @Err<>0 GoTo LB

EXEC @Err=Sp_OAMethod @obj,'Test',@Rst OUTPUT,@source
If @Err<>0 GoTo LB

EXEC @Err=Sp_OADestroy @obj
If @Err<>0 GoTo LB

Return @Rst
LB:
EXEC Sp_OADestroy @obj
RETURN Null
End

--CLR版

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
public partial class SqlFunction
{
//匹配
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString IsMatch(string source,string pattern)
{
SqlString Rst;
if (Regex.IsMatch(source, pattern) == true)
Rst = "True";
else
Rst = "False";
return Rst;
}
//替换
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString MyReplace(string source, string pattern, string value)
{
return Regex.Replace(source, pattern, value);
}
//分割
[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FillRow",TableDefinition="ZFCC_C nvarchar(100)")]
public static IEnumerable Splict(string source, string pattern)
{
return Regex.Split(source, pattern);
}
public static void FillRow(object obj, out SqlString str)
{
str = new SqlString ((string )obj);
}
//统计
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlInt32 Occurs(string source, string pattern)
{
return Regex.Matches(source, pattern).Count;
}
//截取
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString MySubstr(string source, string pattern)
{
string Rst="";
MatchCollection MCollection;
MCollection = Regex.Matches(source, pattern);
foreach (Match M in MCollection)
Rst+=M.Value;
return Rst;
}
};

回答4:

SQL Server数据中运算符与表达式