我正在解析sql子句,我有以下javascript (regex)
(?:(?:(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*发布于 2016-10-15 21:15:36
在(?:(?:(between )(['"]?)(.*?)(\2)( and )(['"]?)(.*?)(\6)))中,第六个组-- (['"]?) --匹配一个空字符串。因此,.*? (第7组)出现在模式的末尾,作为一个惰性模式,匹配它所能匹配的最小数量的字符,即零。
考虑像/I have a .*?/这样的正则表达式,然后对一个I have a cat字符串进行尝试(参见这里的演示)。正则表达式找到I have a,然后.*?部件--匹配除行分隔字符以外的任何零或多个字符--匹配cat之前的空空间,因为这就是惰性量化符的工作方式:与其急切匹配,不如让后续模式匹配,只有当它们失败时,惰性模式才会“扩展”,即尝试匹配。这就是为什么模式末尾的惰性模式匹配它们需要匹配的最少数量的字符:.+?只匹配一个字符,而.*?将匹配0。
有关惰性量词工作方式的更多信息,请参见https://stackoverflow.com/a/5319978/3832970。
由于不能将对空字符串的反向引用用作边界,因此需要使用交替和捕获"和'分隔子字符串到一个捕获组,并将非空格序列捕获到另一个捕获组中。
更好的是,接近模式末尾的\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*请参阅这个regex演示
https://stackoverflow.com/questions/40064009
复制相似问题