2012-01-12 6 views
1

Могу ли я использовать RegEx (insted подстроки), чтобы получить строку в строке?RegEx найти строку в строке

Я хотел бы получить только имена таблиц из серии заявлений INSERT

INSERT INTO tableA VALUES (col1, col2, col3); 
INSERT INTO tableB VALUES (col1, col2, col3); 
INSERT INTO tableC VALUES (col1, col2, col3); 

Использование Regex Я хотел бы получить (одну строку, как я чтение из файла):

tableA 
tableB 
tableC 

Я пытался с этим выражением (INTO)([a-z_])*, который дает мне «INTO TABLEA», который я могу использовать подстроку или Replace, чтобы дать мне отдохнуть, но я предполагаю, что это может быть сделано в RegEx.

+0

Какой язык вы используете? Возможности Regex сильно варьируются от langauge до языка. –

+0

Я использую.Net (C#) – Kman

ответ

2

Используйте это регулярное выражение с просмотром назад:

(?i)(?<=into\s+)\S+ 

var tables = Regex.Matches(s, @"(?i)(?<=into\s+)\S+") 
    .Cast<Match>().Select(m => m.Value); 
+0

Спасибо! Работает как шарм! – Kman

+0

@ Кман, пожалуйста. –

0

Используйте текстовый редактор и найти + Заменить следующим образом:

Find: ^INSERT INTO (.*) VALUES.* 
Replace: \1 

Обязательно отметьте опцию Regular Expression.

Так выглядит мой экран «Блокнот ++» и доверяет мне, он сработал.

enter image description here

0

Вы можете захватить подстроку совпавшей строки, используя круглые скобки:

^ *INSERT\s+INTO\s+(\w+) 

Из результатов матчей, вы можете извлечь первую захваченную группу с помощью \1 или $1 в зависимости от языка.

* и \s+ должны игнорировать дополнительные пробелы.

0

в PHP

$regex = "/INSERT INTO (.*) VALUES/"; 

в Java

String regex = "INSERT INTO (.*?) VALUES"; 

первый захват группа проведет то, что вы хотите.

1

Поскольку вы используете C#, уточню, как я хотел бы сделать это от начала до конца:

 //create regex - the (.*?) is a capture group 
     var regex = new Regex("INSERT INTO (.*?) VALUES"); 

     //mimic text lines read from a file 
     var sqlStrings = new string[] {"INSERT INTO tableA VALUES (col1, col2, col3)", "INSERT INTO tableB VALUES (col1, col2, col3)", "INSERT INTO tableC VALUES (col1, col2, col3)"}; 
     foreach (var line in sqlStrings) 
     { 
      //get the first match with the regex we created 
      var match = regex.Match(line); 

      //print out the first capture group 
      Console.WriteLine(match.Groups[1].ToString()); 
     } 

Это выпишет следующее:

tableA 
tableB 
tableC 

Не уверен, что вашего точного ввода формат (новые строки или нет) и точно, как вы хотите вывести его, но я надеюсь, что это поможет.

И да, это можно сделать гораздо более кратким, но для большей ясности я разделил его на несколько строк и методов.

Смежные вопросы