如何解析字符串以输出单词X和单词Y之间的内容?

时间:2018-12-06 13:46:13

标签: batch-file

假设我有一个这样的查询作为批处理脚本中findstr命令的输出出现:

select a, b, c FROM table1, table2, table3 WHERE something happens

或类似的

select a, b, c from table1

我想选择表名并将它们放在某个地方。 现在,问题在于第一步是“切除” FROM和WHERE条件之间的任何内容     或查询的结尾。我检查了批处理字符串管理工具,但似乎没有任何帮助,因为     其中大多数是基于了解我要提取的数据的确切位置。为了简单起见     假定没有多余的空间可以修剪,并且FROM和WHERE不超过一个     每个查询字词。有线索吗?

2 个答案:

答案 0 :(得分:2)

使用带通配符的字符串替换来分隔前/后缀

:: Q:\Test\2018\12\06\SO_53652818.cmd
@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "suffix=%string:*where=%"
call set "string=%%string: where%suffix%=%%"
set "tables=%string:* from =%%"
set tables

set "string=select a, b, c from table1"

set "suffix=%string:*where=%"
call set "string=%%string: where%suffix%=%%"
set "tables=%string:* from =%%"
set tables

或将单词wherefrom更改为单个字符分隔符

@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "string=%string: where =|%"
set "string=%string: from =|%"
for /f "tokens=2 delims=|" %%A in ("%string%") Do set "tables=%%A"
set tables

使用PowerShell作为工具的另一种替代方法,
正则表达式,具有环视功能(零长度断言),可避免dbenham

提到的陷阱
@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE Country='Mexico'"
For /f "usebackq delims=" %%A in (`
  powershell -NoP -C "if($ENV:String -match '(?<=FROM ).*?(?= (WHERE|GROUP|ORDER))'){$Matches[0]}"
`) do set "tables=%%A"
set tables

答案 1 :(得分:1)

更简单:

@echo off

set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "string=%string: WHERE =" & rem "%"
set "string=%string: FROM =" & set "tables=%"

set tables

我可以对使用的方法进行详细说明,但是如果您仅删除@echo off行,运行程序并仔细查看执行的代码,则这样会更简单。

如果还有其他问题,请发表评论。