Javascript Regex来检测双引号外的模式
我有一根像Javascript Regex来检测双引号外的模式,javascript,c#,.net,regex,string,Javascript,C#,.net,Regex,String,我有一根像 FIND files where file2=29 AND file32="12" OR file623134="file23" 此文本由用户输入以搜索其数据。这将由应用程序转换为SQL查询 例如:FIND替换为SELECT,并使用模式file[number](例如:file2、file32和file623134,如上面的字符串所示)转换为file\u ID=[number]和file\u VALUE=[file[number]的值。生成的SQL查询将是: SELECT * FRO
FIND files where file2=29 AND file32="12" OR file623134="file23"
此文本由用户输入以搜索其数据。这将由应用程序转换为SQL查询
例如:FIND
替换为SELECT
,并使用模式file[number]
(例如:file2
、file32
和file623134
,如上面的字符串所示)转换为file\u ID=[number]和file\u VALUE=[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"])
(?您可以使用以下字符串检测您的文件:
文件([0-9]+)=\”([0-9]+)\”
此正则表达式返回3个字符串,即整个匹配项、字符串中的第一个数字和第二个数字
我希望这是你所期望的
但是我认为您在正则表达式的使用中遗漏了一点:
将多个标记用括号括起来,将它们组合在一起。然后可以对组应用量词。例如,Set(Value)?匹配Set或SetValue
括号创建一个捕获组。上面的示例有一个组。匹配后,如果集合匹配,则组号1不包含任何内容。如果集合值匹配,则组号1包含值。如何访问组的内容取决于您使用的软件或编程语言。组号0始终包含整个正则表达式ch
发件人:
因此,您必须为整行定义一个正则表达式,并为要提取的每个子字符串创建一个匹配组。您可以使用以下字符串检测您的文件:
文件([0-9]+)=\”([0-9]+)\”
此正则表达式返回3个字符串,即整个匹配项、字符串中的第一个数字和第二个数字
我希望这是你所期望的
但是我认为您在正则表达式的使用中遗漏了一点:
将多个标记用括号括起来,将它们组合在一起。然后可以对组应用量词。例如,Set(Value)?匹配Set或SetValue
括号创建一个捕获组。上面的示例有一个组。匹配后,如果集合匹配,则组号1不包含任何内容。如果集合值匹配,则组号1包含值。如何访问组的内容取决于您使用的软件或编程语言。组号0始终包含整个正则表达式ch
发件人:
因此,您必须为整行定义一个正则表达式,并为要提取的每个子字符串创建一个匹配组。如下所示
<div id="date">file23="125"</div>
像这样
<div id="date">file23="125"</div>
这里是另一个两步方法:
- 获取包含ID的键值对,并使用反向引用进行替换
- 用另一个文本替换开头部分(一个文本
“查找其中的文件”
),从“
中的[文件]中选择*
:
结果:
从[FILES]中选择*,其中(FILE_ID=2和FILE_VALUE=29)和(FILE_ID=32和FILE_VALUE=12)或(FILE_ID=623134和FILE_VALUE=file23)
正则表达式细分:
-前面没有单词字符的文本\b文件
文本文件
-捕获到组1中的一个或多个数字(\d+)
-文字=
=
-1或0双引号“?
-第二个捕获组,由1个或多个字母数字符号(字母、数字或下划线)组成(\w+)
-1或0双引号“?
- 获取包含ID的键值对,并使用反向引用进行替换
- 用另一个文本替换开头部分(一个文本
),从“中的[文件]中选择*“查找其中的文件”
从[FILES]中选择*,其中(FILE_ID=2和FILE_VALUE=29)和(FILE_ID=32和FILE_VALUE=12)或(FILE_ID=623134和FILE_VALUE=file23)
正则表达式细分:
-前面没有单词字符的文本\b文件
文本文件
-捕获到组1中的一个或多个数字(\d+)
-文字=
=
-1或0双引号“?
-第二个捕获组,由1个或多个字母数字符号(字母、数字或下划线)组成(\w+)
-1或0双引号“?
查找文件,其中file2=29和file32=“12”或file623134=“file23”
作为解释,我将分步骤进行
显然,与字符串完全匹配的正则表达式将匹配
FIND files where file2=29 AND file32="12" OR file623134="file23"
首先,让我们决定要从中读取哪些位…并使其可访问
FIND (files) where file(2)=(29) AND file(32)=("12") OR file(623134)=("file23")
在这里,我们将要读出的所有位用括号括起来。这将这些位定义为“捕获组”。在C#中,我们可以给它们命名。我们稍后会这样做
现在…让我们对这个正则表达式进行泛化,使其匹配更多的示例。键是数字,因此我们可以用[0-9]+
捕获它们。这意味着至少匹配一次0到9范围内的字符
FIND (files) where file([0-9]+)=(29) AND file([0-9]+)=("12") OR file([0-9]+)=("file23")
好的。现在值…这里有一些字符串。让我们匹配这些
字符串不是由“.”或“[^”]+”
(注意..加号表示我们不能匹配空字符串,因为我们至少需要一个字符。*
将允许您匹配空字符串。)
本例中的一个值是数字。因此,让我们假设它们可以是整数
FIND (files) where file([0-9]+)=([0-9]+) AND file([0-9]+)=("[^"]+") OR file([0-9]+)=("[^"]+")
第一个示例没有什么特别之处。因此,让我们假设所有值都可以是字符串或整数。要生成两个选项,我们使用
选项匹配器。(现在..我想您是
FIND (files) where file([0-9]+)=(29) AND file([0-9]+)=("12") OR file([0-9]+)=("file23")
FIND (files) where file([0-9]+)=(29) AND file([0-9]+)=("[^"]+") OR file([0-9]+)=("[^"]+")
FIND (files) where file([0-9]+)=([0-9]+) AND file([0-9]+)=("[^"]+") OR file([0-9]+)=("[^"]+")
FIND (files) where file([0-9]+)=("[^"]+"|[0-9]+) AND file([0-9]+)=("[^"]+"|[0-9]+) OR file([0-9]+)=("[^"]+"|[0-9]+)
FIND (files) where file([0-9]+)=("[^"]+"|[0-9]+) (AND) file([0-9]+)=("[^"]+"|[0-9]+) (OR) file([0-9]+)=("[^"]+"|[0-9]+)
FIND (files) where file([0-9]+)=("[^"]+"|[0-9]+)( (AND|OR) file([0-9]+)=("[^"]+"|[0-9]+))*
FIND (files) where file([0-9]+)=([^\s]+)( (AND|OR) file([0-9]+)=([^\s]+))*
FIND (files) where file([0-9]+)=("[^"]+"|[^\s]+)( (AND|OR) file([0-9]+)=("[^"]+"|[^\s]+))*
FIND (files) where file([0-9]+)=("(?:\\"|[^"])+"|[^\s]+)( (AND|OR) file([0-9]+)=("(?:\\"|[^"])+"|[^\s]+))*
FIND (?<table>files) where file(?<key>[0-9]+)=(?<value>"(?:\\"|[^"])+"|[^\s]+)( (?<operator>AND|OR) file(?<key>[0-9]+)=(?<value>"(?:\\"|[^"])+"|[^\s]+))*
FIND (?<table>files)( (?<operator>AND|OR|where) file(?<key>[0-9]+)=(?<value>"(?:\\"|[^"])+"|[^\s]+))+
var pair = @"(?<pair>file(?<key>[0-9]+)=(?<value>"(?:\\\"|[^\"])+\"|[^\s]+))";
var query = @"FIND (?<table>files) where "+pair+"( (?<operator>AND|OR) "+pair+")*";
var ex = new Regex(query);
var query = @"FIND (?<table>files)(?<condition> (?<operator>AND|OR|where) file(?<key>[0-9]+)=(?<value>"(?:\\\"|[^\"])+\"|[^\s]+))+";
var ex = new Regex(query);
var match = ex.Match(...);
... match.Groups["table"].Value ...