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)
where str
=処理する必要がある生の文字列。
どういうわけか、VARCHAR(8000) がピックアップされています。正規表現を微調整すると、CHAR(int) または NCHAR(int) インスタンスのいずれかのスペースと「+」だけでなく、xtype の後の「=」がなくなります。
誰かが私をこれから引き離してくれることを願っています。
追加のサンプル文字列:
弦"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)))"