首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript regex -为什么需要一个终止空间来匹配整个字符串

Javascript regex -为什么需要一个终止空间来匹配整个字符串
EN

Stack Overflow用户
提问于 2016-10-15 20:42:49
回答 1查看 64关注 0票数 1

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

代码语言:javascript
复制
(?:(?:(between )(['"]?)(.*?)(\2)( and )(['"]?)(.*?)(\6)))

我正与之相匹配

代码语言:javascript
复制
id BETWEEN 3 and 10

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

有人能解释为什么这种额外空间的匹配对于匹配字符串的10部分(在捕获组7中)是必要的吗?

请注意,此正则表达式是从用于解析sql筛选器的较大的正则表达式中提取的:

代码语言:javascript
复制
(\(*)([\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*
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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*,以允许字符串不以空格结尾。

代码语言:javascript
复制
(\(*)(\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演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40064009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档