如何将复杂的 SQL 值字符串安全地解析为列

问题描述 投票:0回答:1

我正在使用一个表示 SQL 参数值的字符串,并且需要将其解析为各个列。这是此类字符串的示例:

values = "( 14587, '290\'960', 'This is, a, difficult,,, string that uses '' \" and even '' \" , '' '', ''. So it definitely needs to be checked for escape characters.', null )"

目标是将这些值提取到列列表中,应对各种挑战:

  • 不同的数据类型:值可以是整数、字符串或空。

  • 转义字符:字符串可能包含转义单引号 (''), 反斜杠或其他特殊字符。

  • 嵌入式分隔符:逗号 可能出现在字符串内部,用逗号进行天真的分割 不可能的。

  • 引号匹配:正确匹配周围的单引号 字符串是必不可少的。

我尝试使用正则表达式来处理引号外的逗号分隔:

import re

values = "( 14587, '290\'960', 'This is, a, difficult,,, string that uses '' \" and even '' \" , '' '', ''. So it definitely needs to be checked for escape characters.', null )"

# Remove outer parentheses and leading/trailing spaces
cleaned_values = values.strip().strip('()')

# Use regular expression to split by commas outside quotes, accounting for escaped quotes
values_list = re.split(r",(?=(?:[^']*'[^']*')*[^']*$)", cleaned_values)

# Strip whitespace from each part
values_list = [v.strip() for v in values_list]

print(cleaned_values)
for value in values_list:
    print(value)

这种方法在某种程度上有效,但感觉很脆弱,可能无法处理所有边缘情况,尤其是更复杂的 SQL 字符串。

问题: 将此类 SQL VALUES 字符串解析为各个列的最佳和最可靠的方法是什么,确保以下几点:

  • 正确处理不同的数据类型。
  • 正确转义和解析特殊字符。
  • 通过嵌入的逗号或引号保持字符串的完整性。

专用的 SQL 解析器或其他方法会比正则表达式更合适吗?

python string
1个回答
0
投票

您可以搜索:

  1. 术语之前的可选空格
    \s*
    ;
  2. 该术语是:
    • 不带引号或空格的字符串
      [^'\s]+
      ;或
    • 以单引号开头和结尾的字符串,其中包含非单引号或单引号对的字符
      '(?:[^']|'')*'
  3. 后跟可选空格以及术语分隔符或字符串结尾
    \s*(?:,|$)

像这样:

import re

values = "( 14587, '290\'960', 'This is, a, difficult,,, string that uses '' \" and even '' \" , '' '', ''. So it definitely needs to be checked for escape characters.', null )"

values_list = re.findall(
    r"\s*([^'\s]+|'(?:[^']|'')*')\s*(?:,|$)",
    values.strip().strip('()'),
)

for value in values_list:
    print(value)

哪个输出:

14587
'960'
'This is, a, difficult,,, string that uses '' " and even '' " , '' '', ''. So it definitely needs to be checked for escape characters.'
null
© www.soinside.com 2019 - 2024. All rights reserved.