C# 正则提取sql语句字符串里的字段名
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 正则提取sql语句字符串里的字段名相关的知识,希望对你有一定的参考价值。
如:
"select * from tabel where (id=1 and name like '%han%' and data_format(date,'%Y-%m-%d') <= '2016-07-14' and state is not null) or fkid in (select id2 from t2 where valid!=0)"
提取出"id","name","fkid","date","state","id2","valid"这些字段的字符串。
如题,正则太菜,求大神,最好带上解释,如果有别的方案可以解决也成,可加分。
substring 使用方法,参考下列SQL:
declare @T nvarchar(10)
set @T='12345abcde'
select substring(@T,1,5)
结果如下:12345
如果是SQL 写正则表达式判断,只能通过存储过程或函数来处理
SQL 如下:
CREATE FUNCTION dbo.find_regular_expression
(
@source varchar(5000), --需要匹配的源字符串
@regexp varchar(1000), --正则表达式
@ignorecase bit = 0 --是否区分大小写,默认为false
)
RETURNS bit --返回结果0-false,1-true
AS
BEGIN
--0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。
DECLARE @hr integer
--用于保存返回的对象令牌,以便之后对该对象进行操作
DECLARE @objRegExp integer DECLARE @objMatches integer
--保存结果
DECLARE @results bit
/*
创建 OLE 对象实例,只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate,
并确定机器中有VBScript.RegExp类库
*/
EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
/*
以下三个分别是设置新建对象的三个属性。下面是'VBScript.RegExp'中常用的属性举例:
Dim regEx,Match,Matches '建立变量。
Set regEx = New RegExp '建立一般表达式。
regEx.Pattern= patrn '设置模式。
regEx.IgnoreCase = True '设置是否区分大小写。
regEx.Global=True '设置全局可用性。
set Matches=regEx.Execute(string) '重复匹配集合
RegExpTest = regEx.Execute(strng) '执行搜索。
for each match in matches '重复匹配集合
RetStr=RetStr &"Match found at position "
RetStr=RetStr&Match.FirstIndex&".Match Value is '"
RetStr=RetStr&Match.Value&"'."&vbCRLF Next
RegExpTest=RetStr
*/
EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
--调用对象方法
EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
--释放已创建的 OLE 对象
EXEC @hr = sp_OADestroy @objRegExp
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
RETURN @results
END 参考技术A 你提取字段 有什么意义 么?追问
领导叫这么干的,算意义么 = =
追答意思是 你现在有很多SQL , 要提取出每个SQL 里的字段?
,还是 只有一个SQL,提取字段?
嗯一堆sql,每个sql里用到的字段都得提取出来,所以才想搞个正则来倒腾
追答还是感觉没有意义, 就像你例子中写的,SQL语句检索用*号, 检索的实际字段你是提不出来的, 可以问问作用是什么。
写正则表达式, 首先得理清规律,才好写, 貌似 没找到很全的规律
主要是提取where条件里的字段名,差不多就是取等号、大于等于前的字段名的字符串,尴尬就尴尬在,sql语句里会出现date_format这样的方法,正则就不知道咋写了。。
sql server中对字段使用正则表达式替换???
sqlserver中对字段使用正则表达式替换?
.replace(num,
'\d','#') 参考技术A 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'
字符串存在换行的时候当作多行处理.这样$就可匹配每行的结尾.不然的话$只匹配字符串最后的位置、
示例:
1
select
*
from
emp
where
regexp_like(ename,'^a[a-z]*n$');
可以查找ename中以a开头以n结尾的行.例如ename为arwen或arwin或anden.但arwen不能被匹配.因为默认是区分大小写.如果是
1
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里面的相同.
示例:
1
2
3
4
5
6
7
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函数
示例:
1
2
3
4
5
6
7
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函数.
例如:
1
2
3
4
5
6
7
declare
v_result
varchar2(255);
begin
select
regexp_substr('hello
world','l2')
into
v_result
from
dual;
dbms_output.put_line(v_result);
end
;
结果为ll
查询到匹配的字符串才返回匹配的字符.没查到就返回空。
以上是关于C# 正则提取sql语句字符串里的字段名的主要内容,如果未能解决你的问题,请参考以下文章