regex 正则表达式匹配特定单词集后由一个点分隔的单词,直到空格

pzfprimi  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(110)

我需要从包含SQL查询的字符串中获取schemaName.tableName。
例如

Select t1.column1, t1.column2, t2.column3, to.column4 from ABC.TABLE1 t1 inner join XYZ.TABLE2 t2 where t1.id=t2.id;

正则表达式匹配后,我应该得到一个包含schemaName.tableName的数组
[ABC表1,XYZ表2]
这个模式应该能够从任何SQL查询中获取schemaName.tableName。
我怎样才能创造出这种模式请帮助我。
我试着跟着,但没有结果
https://regex101.com/r/D82EJh/1

[^\/,\s\?#]+?\.[^\/,\s]+?(?=\/|\s|$|\?|#)
qf9go6mv

qf9go6mv1#

这个模式应该能够从任何SQL查询中获取schemaName.tableName。
要完成这个公式化的任务,您需要组织一个完整的项目,但项目的成功与否取决于所选择的sql语言的方言。也许您会满足于解决一个更简单的问题:如何得到单词"from"或"join"后面的单词数组(包括点)。然后我在下面提出这样的解决方案。

const sql = "Select t1.column1, t1.column2, t2.column3, to.column4 from ABC.TABLE1 t1 inner join XYZ.TABLE2 t2 where t1.id=t2.id;";
console.log(sql);
const regex = /(?<=\b(from|join)\s)(\S+)/g;
const found = sql.match(regex);
console.log(found);

此代码应显示在控制台中:* ["ABC表格1"、"XYZ表格2"]*

cgh8pdjw

cgh8pdjw2#

您可以使用捕获组,并匹配允许的字符:

\b(?:join|from)\s+(\w+\.\w+)
    • 说明**
  • \b字边界
  • (?:join|from)\s+匹配join或from,后跟1个或多个空格字符
  • (捕获组1 (保存所需值)
  • \w+\.\w+匹配1个或多个单词字符,然后匹配一个点,再匹配1个或多个单词字符
  • )关闭组1

参见regex101 demo
如果单词字符后面应该有1个点并且没有更多的非空白字符,则可以Assert空白边界:

\b(?:join|from)\s+(\w+\.\w+)(?!\S)

相关问题