我有一个像
这样的字符串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 个双引号
关于javascript - 正则表达式检测双引号外的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33258416/