我正在尝试使用 CHAR(int) 和 NCHAR(int) 处理字符串,以将这些实例与它们的 ASCII 对应部分进行转换。一个例子是这样的:
CHAR(124) + (SELECT TOP 1 CAST(name AS VARCHAR(8000)) FROM (SELECT TOP 1 colid, name FROM [Projects]..[syscolumns]
WHERE xtype=char(85)
AND id = OBJECT_ID(NCHAR(69)+NCHAR(78)+NCHAR(95)+NCHAR(69)+NCHAR(109)+NCHAR(112)+NCHAR(108))
请注意,我不想对 VARCHAR(int) 做任何事情,只对 CHAR(int) 和 NCHAR(int) 部分做任何事情。以上应翻译为:
|(SELECT TOP 1 CAST(name AS VARCHAR(8000)) FROM (SELECT TOP 1 colid, name FROM [Projects]..[syscolumns] WHERE xtype=U AND id = OBJECT_ID(EN_Empl)
请注意,应删除 CHAR(int) 或 NCHAR(int) 两侧的任何“+”。我尝试了以下方法:
def conv(m):
return chr(int(m.group(2)))
print re.sub(r'([\+ ]?n?char\((.*?)\)[\+ ]?)', conv, str, re.IGNORECASE)
其中str
= 必须处理的原始字符串。
不知何故,VARCHAR(8000) 正在被拾取。如果我调整正则表达式,xtype 之后的“=”就会消失,而不仅仅是 CHAR(int) 或 NCHAR(int) 实例两侧的空格和“+”。
希望有人能把我拉出来。
其他示例字符串:
细绳"char(124)+(Select Top 1 cast(name as varchar(8000)) from (Select Top 1 colid,name From [Projects]..[syscolumns]
Where id = OBJECT_ID(NCHAR(69)+NCHAR(78)+NCHAR(95)+NCHAR(69)+NCHAR(109)+NCHAR(112)+NCHAR(108)))"
正则表达式:r'(\bn?char\((\d+)\)(?:\s*\+\s*)?)'
结果:"|(Select Top 1 cast(name as varchar(8000)) from (Select Top 1 colid,name From [Projects]..[syscolumns] Where id = OBJECT_ID(ENCHAR(78)+NCHAR(95)+NCHAR(69)+NCHAR(109)+NCHAR(112)+NCHAR(108)))"