Как мне разобрать строку, чтобы вывести ее содержимое между словом X и словом Y? - PullRequest
0 голосов
/ 06 декабря 2018

Допустим, у меня есть запрос, подобный этому, который выводится в виде команды команды findstr в пакетном скрипте:

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

или как этот

select a, b, c from table1

Я хочу выбратьимена таблиц и положить их куда-нибудь.Теперь проблема заключается в том, что первым шагом является «вырезание» всего, что находится между FROM и условием WHERE или концом запроса.Я проверил инструменты управления пакетными строками, и ничто не кажется полезным, поскольку большинство из них основано на знании точного положения данных, которые я хочу извлечь.Для простоты предположим, что нет лишних пробелов, которые нужно обрезать, и что в запросе не более одного слова FROM и WHERE.Есть ли какие-либо выводы?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Проще:

@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, запустите программу и внимательно просмотрите выполненный код...

Если у вас возникнут дополнительные вопросы, оставьте комментарий.

0 голосов
/ 06 декабря 2018

Используйте подстановку строк с подстановочными знаками, чтобы выделить пре- / суффикс

:: 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

или изменить слова where, from на один разделитель символов

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...