You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式提取FROM后至空格/左括号前的字符串?

刚好碰到过类似的需求,我来帮你调整正则,完美解决这三个场景的提取问题!

提取FROM之后目标字符串的正则解决方案

首先明确核心需求:从SQL风格的语句中,精准提取FROM后面紧接着的内容,直到遇到第一个空格或左括号为止,完全匹配你给出的三个测试场景预期结果。

原正则的问题分析

你之前写的正则/(?<=FROM ).*(?= (\s|[(]))/g存在两个小漏洞:

  • .*是贪婪匹配,虽然当前场景下不会出问题,但逻辑上不够严谨,容易在复杂语句中匹配过多内容
  • 正向预查里多写了一个空格(?= (\s|[(])),导致第三个测试用例(item后直接跟空格+AND)无法匹配,因为预查要求后面是「空格+空格/左括号」,不符合实际场景

修正后的精准正则

用这个正则就能完美覆盖所有测试场景:

(?<=FROM\s)[^\s(]+

正则逻辑拆解

  • (?<=FROM\s):正向肯定后行断言,确保匹配内容紧跟在FROM加一个空格之后,避免误匹配其他包含FROM的片段
  • [^\s(]+:否定字符集匹配,匹配一个或多个「不是空格、不是左括号」的字符,会自动在第一个空格或左括号位置停止匹配,刚好对应你的三个需求:
    1. 遇到where前的空格 → 停止,提取item.ui
    2. 遇到(x,y)的左括号 → 停止,提取item.ui
    3. 遇到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:47:40