2016-05-18 2 views
1

У меня есть строка, подобная приведенной ниже, и я хотел бы написать что-то, чтобы проверить, что следует за следующим форматом.Как изменить формат/шаблон на строку?

Insert into TABLE(A, B, C, D, E, F, G, H) values (123, 'VALUE ' , ' ', ' ', 'XXX', 'CCC', ' ', ' '); 

Это будет ошибка.

Insert into TABLE(A, B, C, D, E, F, G, H) values (123, ''VALUE ''' , '', '', 'RED', 'FAX', '', ''); 

Как вы можете видеть, вторая имеет либо дополнительную запятую, либо дополнительную цитату. (В основном проверьте все внутри круглых скобок значений, вставка никогда не изменяется.)

Я хотел бы проверить неправильный шаблон и отредактировать его на лету. Есть идеи?

+1

Вы разрешаете пользователям вводить SQL в виде обычного текста? Потому что это не-нет. – Compass

+0

нет! Просто имейте огромную стену текста, чтобы исправить. – Beto

+0

Если это идентичный SQL, разделите строку на «значения», возьмите split [1] и разделите это на запятую, затем подсчитайте количество апострофов в каждом расколе. – Compass

ответ

1

Описание

^[^(]*table\([^)]*\)[^(]*?Values\s* 
(\((?:(?:[^';\n\r]*|'[^']*')\s*(?:(?=\))|,)\s*)*\)) 

Regular expression visualization

Это регулярное выражение будет делать следующее:

  • Ищите строки, начинающиеся со структурой, которая выглядит как Insert into TABLE(....) values
  • Проверяется раздел values содержит запятую список значений, которые только
    • строки не заключены в кавычки, как 123
    • строки, заключенные в одинарные кавычки, как 'red'
  • позволяют белое пространство окружать любой разграничивающих запятой
  • позволяют строки в кавычках, чтобы содержать запятые как 'This, value has a comma'

Примечания:

  • Если регулярное выражение не соответствует вашей строке, то есть проблема с исходной строкой
  • Я рекомендую использовать следующие флаги для этого: Case insenstive.

Примеры

Живой пример

В этом примере я использую многострочный, глобальный, и игнорировать белые варианты пространства. Чтобы лучше проиллюстрировать, как это работает.

https://regex101.com/r/iW9gI7/1

Источник Строка

Последняя строка здесь не действует

Insert into TABLE(A, B, C, D, E, F, G, H) values (123); 
Insert into TABLE(A, B, C, D, E, F, G, H) values (123, 'VALUE ', ' ', ' ', 'XXX', 'CCC', ' ', ' '); 
Insert into TABLE(A, B, C, D, E, F, G, H) values (123, 'VAL,UE ' , ' ', ' ', 'XXX', 'CCC', ' ', ' '); 
Insert into TABLE(A, B, C, D, E, F, G, H) values (123, ''VALUE ''' , '', '', 'RED', 'FAX', '', '') 

Действительно соответствует

Insert into TABLE(A, B, C, D, E, F, G, H) values (123) 
Insert into TABLE(A, B, C, D, E, F, G, H) values (123, 'VALUE ', ' ', ' ', 'XXX', 'CCC', ' ', ' ') 
Insert into TABLE(A, B, C, D, E, F, G, H) values (123, 'VAL,UE ' , ' ', ' ', 'XXX', 'CCC', ' ', ' ') 

Пояснение

NODE      EXPLANATION 
---------------------------------------------------------------------- 
^      the beginning of a "line" 
---------------------------------------------------------------------- 
    [^(]*     any character except: '(' (0 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    table     'table' 
---------------------------------------------------------------------- 
    \(      '(' 
---------------------------------------------------------------------- 
    [^)]*     any character except: ')' (0 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    \)      ')' 
---------------------------------------------------------------------- 
    [^(]*?     any character except: '(' (0 or more times 
          (matching the least amount possible)) 
---------------------------------------------------------------------- 
    Values     'Values' 
---------------------------------------------------------------------- 
    \s*      whitespace (\n, \r, \t, \f, and " ") (0 or 
          more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    \(      '(' 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (0 or more 
          times (matching the most amount 
          possible)): 
---------------------------------------------------------------------- 
     (?:      group, but do not capture: 
---------------------------------------------------------------------- 
     [^';\n\r]*    any character except: ''', ';', '\n' 
           (newline), '\r' (carriage return) (0 
           or more times (matching the most 
           amount possible)) 
---------------------------------------------------------------------- 
     |      OR 
---------------------------------------------------------------------- 
     '      '\'' 
---------------------------------------------------------------------- 
     [^']*     any character except: ''' (0 or more 
           times (matching the most amount 
           possible)) 
---------------------------------------------------------------------- 
     '      '\'' 
---------------------------------------------------------------------- 
    )      end of grouping 
---------------------------------------------------------------------- 
     \s*      whitespace (\n, \r, \t, \f, and " ") 
           (0 or more times (matching the most 
           amount possible)) 
---------------------------------------------------------------------- 
     (?:      group, but do not capture: 
---------------------------------------------------------------------- 
     (?=      look ahead to see if there is: 
---------------------------------------------------------------------- 
      \)      ')' 
---------------------------------------------------------------------- 
     )      end of look-ahead 
---------------------------------------------------------------------- 
     |      OR 
---------------------------------------------------------------------- 
     ,      ',' 
---------------------------------------------------------------------- 
    )      end of grouping 
---------------------------------------------------------------------- 
     \s*      whitespace (\n, \r, \t, \f, and " ") 
           (0 or more times (matching the most 
           amount possible)) 
---------------------------------------------------------------------- 
    )*      end of grouping 
---------------------------------------------------------------------- 
    \)      ')' 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
+1

Если бы у вас было больше очков, я бы это сделал. Отличное объяснение человека. Большое спасибо. – Beto

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