如何编写正则表达式提取FROM后至空格/左括号前的字符串?
刚好碰到过类似的需求,我来帮你调整正则,完美解决这三个场景的提取问题!
提取FROM之后目标字符串的正则解决方案
首先明确核心需求:从SQL风格的语句中,精准提取FROM后面紧接着的内容,直到遇到第一个空格或左括号为止,完全匹配你给出的三个测试场景预期结果。
原正则的问题分析
你之前写的正则/(?<=FROM ).*(?= (\s|[(]))/g存在两个小漏洞:
.*是贪婪匹配,虽然当前场景下不会出问题,但逻辑上不够严谨,容易在复杂语句中匹配过多内容- 正向预查里多写了一个空格
(?= (\s|[(])),导致第三个测试用例(item后直接跟空格+AND)无法匹配,因为预查要求后面是「空格+空格/左括号」,不符合实际场景
修正后的精准正则
用这个正则就能完美覆盖所有测试场景:
(?<=FROM\s)[^\s(]+
正则逻辑拆解
(?<=FROM\s):正向肯定后行断言,确保匹配内容紧跟在FROM加一个空格之后,避免误匹配其他包含FROM的片段[^\s(]+:否定字符集匹配,匹配一个或多个「不是空格、不是左括号」的字符,会自动在第一个空格或左括号位置停止匹配,刚好对应你的三个需求:- 遇到
where前的空格 → 停止,提取item.ui - 遇到
(x,y)的左括号 → 停止,提取item.ui - 遇到
AND前的空格 → 停止,提取item
- 遇到
测试代码验证
把正则放到代码里测试三个示例:
const testCases = [ "Select FROM item.ui where blah blah blah", "Select FROM item.ui(x,y) AND blah blah...", "Select FROM item AND blah blah..." ]; const extractPattern = /(?<=FROM\s)[^\s(]+/; testCases.forEach(str => { const matchResult = str.match(extractPattern); console.log(`输入语句: ${str}\n提取结果: ${matchResult ? matchResult[0] : '无匹配内容'}\n`); });
运行后会输出:
输入语句: Select FROM item.ui where blah blah blah 提取结果: item.ui 输入语句: Select FROM item.ui(x,y) AND blah blah... 提取结果: item.ui 输入语句: Select FROM item AND blah blah... 提取结果: item
完全符合你的预期!
额外适配说明
如果你的业务场景中存在多个FROM(比如复杂嵌套查询),可以给正则加上g标志,变成/(?<=FROM\s)[^\s(]+/g,这样就能提取所有符合条件的字符串。
内容的提问来源于stack exchange,提问作者Puvvl
相关产品推荐
相关产品推荐

