Skip to main content
 首页 » 编程设计

javascript之正则表达式检测双引号外的模式

2024年01月31日27jyk

我有一个像

这样的字符串
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 个双引号