Javascript正则表达式-为什么需要终止空格来匹配整个字符串

Javascript正则表达式-为什么需要终止空格来匹配整个字符串,javascript,regex,Javascript,Regex,我正在解析SQLWHERE子句,我有以下javascript() 我的对手 id BETWEEN 3 and 10 为了使这个正则表达式工作,我必须在正则表达式的末尾添加\s或\s+,并在匹配的字符串的末尾包含一个空格 有人能解释一下为什么要匹配字符串的10部分(在捕获组7中),必须匹配额外的空间吗 请注意,此正则表达式是从用于解析sql筛选器的 (\(*)([\w][\w\d.]*)\s*([<>!=]{1,2}|like|not like|is null|is not null

我正在解析SQLWHERE子句,我有以下javascript()

我的对手

id BETWEEN 3 and 10
为了使这个正则表达式工作,我必须在正则表达式的末尾添加
\s
\s+
,并在匹配的字符串的末尾包含一个空格

有人能解释一下为什么要匹配字符串的
10
部分(在捕获组7中),必须匹配额外的空间吗

请注意,此正则表达式是从用于解析sql筛选器的

(\(*)([\w][\w\d.]*)\s*([<>!=]{1,2}|like|not like|is null|is not null|in\s*\()?\s*(?!and|or)(?:(?:(between )(['"]?)(.*?)(\5)( and )(['"]?)(.*?)(\9))|(?:(['"]?)(.*?)(\12)))\s*(\)*)\s+(?!'|")\s*(and|or)?\s*
(\(*)([\w][\w\d.]*)\s*([!=]{1,2}like | not like |为空| not null | in\s*([\w][\w\d.]*)\s*(?:((?:(介于)之间)(['”)(*)(\5)(和)(['”)(*)(*)(*)(\9))(:(['”)([')([“)(?))(*)(*)(\s*))(\s*)(\s*)和(*)。)*
(?:(?:(中间)(['“]?)(.*?(\2)(和)([''“]?)(.*?(\6))
中,第六组-
(['“]?)
)匹配一个空字符串。因此,
*?
(第七组)出现在模式的末尾,作为一个惰性模式,它匹配的字符数最少,即零

考虑像
/I have a.*?/
这样的正则表达式,您可以在
I have a cat
字符串上尝试它(请参阅).regex找到
我有一个
,然后
*?
部分-匹配除换行符以外的任何零个或多个字符-尽可能少地匹配
cat
之前的空白,因为这就是惰性量词的工作方式:它们不急于匹配,而是让后续模式匹配,并且只有在如果失败,惰性模式将“扩展”,即尝试匹配。这就是为什么模式末尾的惰性模式匹配需要匹配的最小字符数:
+?
将只匹配1个字符,
*?
将匹配0个字符

有关惰性量词如何工作的更多信息,请参见

由于不能使用对空字符串的反向引用作为边界,因此需要使用alternation并将
分隔的子字符串捕获到一个捕获组中,并将一个非空白序列捕获到另一个捕获组中

此外,靠近模式结尾的
\s+
需要更改为
\s*
,以允许字符串不以空格结尾

(\(*)(\w[\w.]*)\s*([<>!=]{1,2}|like|not like|is null|is not null|in\s*\()?\s*(?!and|or)(?:(?:(between )(?:(['"])(.*?)(\5)|(\S+))( and )(?:(['"])(.*?)(\10)|(\S+)))|(?:(['"])(.*?)(\14)|(\S+)))\s*(\)*)\s*(?!'|")\s*(and|or)?\s*
(2)除上述两种可能的代码之外,其他一些国家的(代码)除除上述两种可能的代码外,)除上述两种可能的(代码)除除除除上述两种之外的其他除除除除除上述上述两种可能外,()除除上述两种可能外,)除除上述两种可能的(代码)除除上述两种可能之外,)除除除上述上述两种可能之外,(()除除除除除除上述上述两种可能之外,)除除其他其他其他其他其他其他(()除除除除其他其他其他其他其他,)可能的,,)除除除除上述上述上述上述上述两名,,,,,,)除除除除其他其他其他其他其他其他其他其他其他((()除除除除除除除除除除除除其他其他其他其他其他其他其他,)可能可能可能可能的,,,)除除除除除除除除除除除除除除其他其他其他其他其他其他其他其他其他其他,,,,,,)和|或?\s*

请参见

事实上很明显,第6组匹配的是一个空字符串。因此,
*?
位于模式的末尾,作为一个惰性模式,它匹配的字符数最少,即此处为零。如果不进一步说明您需要匹配什么,我无法提出任何建议,但肯定
*?
必须匹配替换为更贪婪的模式,或者您需要在它之后添加其他必需的模式。真正的模式是什么?@WiktorStribiżew-我已经包含了用于解析mysql筛选器的更大的模式和链接。这种方法存在一定的问题,因为您不能使用空字符串的反向引用作为边界。您需要向我们咨询e替换和捕获
"
将部分分隔成一个捕获组,将一系列非空白分隔成另一个捕获组。@WiktorStribiżew-请原谅这个可能很明显的问题。为什么这里的最小字符数为零?为什么在末尾添加一个空格可以使其与字符串
10
匹配?我将为答案添加更多内容。Excellent、 我很感激你解释
,只有当它们失败时,懒惰模式才会“扩展”
,以及边界周围的微妙之处。我在regex还是比较新的,这些更精细的点让一切变得不同。
(\(*)(\w[\w.]*)\s*([<>!=]{1,2}|like|not like|is null|is not null|in\s*\()?\s*(?!and|or)(?:(?:(between )(?:(['"])(.*?)(\5)|(\S+))( and )(?:(['"])(.*?)(\10)|(\S+)))|(?:(['"])(.*?)(\14)|(\S+)))\s*(\)*)\s*(?!'|")\s*(and|or)?\s*