我有一个像
这样的字符串FIND files where file2=29 AND file32="12" OR file623134="file23"
此文本由用户输入以搜索他/她的数据。这由应用程序转换为 SQL 查询。
例如:FIND 替换为 SELECT 和带有模式 file[number] 的字符串(例如:file2、file32 和 file623134,如上面的字符串所示。)转换为 FILE_ID=[number] AND FILE_VALUE=[value of FILE[number]。生成的 SQL 查询将是:
SELECT * FROM [FILES] WHERE (FILE_ID=2 AND FILE_VALUE=29) AND (FILE_ID=32 AND FILE_VALUE="12") OR (FILE_ID=623134 AND FILEVALUE="file23")
到目前为止,在其他 SO 问题的帮助下,我所取得的成就是使用以下正则表达式检测双引号外的字符串:
(?<![\S"])([^"\s]+)(?![\S"])
它工作正常。但是由于我缺乏关于正则表达式的知识,我无法在此正则表达式中找到可以放置 file[0-9] 模式的位置。请告诉我如何实现这一目标?
如果可能的话,请告诉我如何从这些模式中提取值并将它们替换为相应的值,例如 file123=2 和 (FILE_ID=123 AND FILE_VALUE=2).
请您参考如下方法:
这是另一种两步法:
- 获取其中包含 ID 的键值对,并使用反向引用替换
- 将开头部分(文字
"FIND files where")替换为另一个文字"SELECT * FROM [FILES] WHERE"。
C# demo :
var str = "FIND files where file2=29 AND file32=\"12\" OR file623134=\"file23\"";
var rx = new Regex(@"\bfile(\d+)=""?(\w+)""?");
var result = rx.Replace(str, "(FILE_ID=$1 AND FILE_VALUE=$2)")
.Replace("FIND files where", "SELECT * FROM [FILES] WHERE");
Console.WriteLine(result);
结果:
SELECT * FROM [FILES] WHERE (FILE_ID=2 AND FILE_VALUE=29) AND (FILE_ID=32 AND FILE_VALUE=12) OR (FILE_ID=623134 AND FILE_VALUE=file23)
正则表达式分解:
\bfile- 前面没有单词字符的file文字(\d+)- 捕获到第 1 组的 1 个或多个数字=- 文字="?- 1 或 0 个双引号(\w+)- 由 1 个或多个字母数字符号(字母、数字或下划线)组成的第二个捕获组"?- 1 或 0 个双引号
