Описание
^[^(]*table\([^)]*\)[^(]*?Values\s*
(\((?:(?:[^';\n\r]*|'[^']*')\s*(?:(?=\))|,)\s*)*\))
Это регулярное выражение будет делать следующее:
- Ищите строки, начинающиеся со структурой, которая выглядит как
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
----------------------------------------------------------------------
Вы разрешаете пользователям вводить SQL в виде обычного текста? Потому что это не-нет. – Compass
нет! Просто имейте огромную стену текста, чтобы исправить. – Beto
Если это идентичный SQL, разделите строку на «значения», возьмите split [1] и разделите это на запятую, затем подсчитайте количество апострофов в каждом расколе. – Compass