[英]Javascript regex to match part of the string but not the whole string
[英]Javascript regex - why a terminating space is needed to match the whole string
我正在解析 sql WHERE 子句,并且我有以下 javascript(正则表达式)
(?:(?:(between )(['"]?)(.*?)(\2)( and )(['"]?)(.*?)(\6)))
我匹配的
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*
在(?:(?:(between )(['"]?)(.*?)(\\2)( and )(['"]?)(.*?)(\\6)))
,第 6 个group - (['"]?)
- 匹配一个空字符串。因此, .*?
(第 7 组)出现在模式的末尾,并且是一个惰性模式,匹配它可以匹配的最少数量的字符,即是,零。
考虑像/I have a .*?/
这样的正则表达式,然后针对I have a cat
字符串尝试它(请参阅此处的演示)。 正则表达式发现I have a
,然后是.*?
part -尽可能少地匹配除换行符以外的任何零个或多个字符 - 匹配cat
之前的空白空间,因为这就是惰性量词的工作方式:它们不是急切地匹配,而是让后续模式匹配,并且只有当它们失败时,懒惰模式将“扩展”,即会尝试匹配。 这就是为什么模式末尾的惰性模式匹配它们需要匹配的最少字符数: .+?
将只匹配 1 个字符,而.*?
将匹配 0。
有关惰性量词如何工作的更多信息,请参阅贪婪与不情愿与占有量词。
由于您不能使用对空字符串的反向引用作为边界,您将需要使用交替并将"
和'
分隔的子字符串捕获到 1 个捕获组中,并将非空白序列捕获到另一个中。
Besdies,靠近模式末尾的\\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*
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.