Один ответ лайнера является localeCompare()
const ary = ["Kevin", "brandy", "Andrew"];
ary.sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
console.log(ary);
RegEx не очень хорош в этом, поскольку это намного более сложно, чем это появляется:
Я мог бы продолжать.
То, что можно сделать, ищут sql синтаксический анализатор и выполняют запрос через это.
Я нашел этот сайт, который имеет БОЛЬШОЙ синтаксический анализатор!
вполне достойно. Работы обработка.
Все сказало о полноценности такого regex в контексте SQL. Если Вы настаиваете на regex, и Ваши SQL-операторы всегда похожи на тот, который Вы показали (который не означает подзапросов, соединений, и так далее), Вы могли использовать
FROM\s+([^ ,]+)(?:\s*,\s*([^ ,]+))*\s+
Это определенно не легко.
Рассмотрите подзапросы.
select
*
from
A
join (
select
top 5 *
from
B)
on B.ID = A.ID
where
A.ID in (
select
ID
from
C
where C.DOB = A.DOB)
Существует три таблицы, используемые в этом запросе.
Я думаю, что было бы легче маркировать строку и искать ключевые слова SQL, которые могли, связал имена таблиц. Вы знаете, что имена будут следовать FROM
, но они могли сопровождаться WHERE
, GROUP BY
, HAVING
, или никакое ключевое слово вообще, если они в конце запроса.
Построение регулярного выражения будет наименьшей из ваших проблем. В зависимости от того, какой SQL вы собираетесь поддерживать с помощью этого кода, количество способов ссылки на таблицу в SQL-запросе просто ошеломляет.
К тому же, если запрос включает ссылку на представление или UDF, информация о том, какие таблицы лежат в основе, вообще не будет содержаться в строке, что делает совершенно непрактичным получение этой информации путем ее разбора. Кроме того, вам придется проявить смекалку, чтобы обнаружить временные таблицы и исключить их из результатов.
Если вы должны это сделать, то лучшим подходом будет использование API для конкретного механизма базы данных, для которого предназначен SQL. Например, вы можете создать представление на основе запроса, а затем использовать API DB Server для обнаружения зависимостей для этого представления. Движок БД сможет разобрать его гораздо надежнее, чем вы когда-либо сможете это сделать без огромных усилий по реинжинирингу движка запросов.
Если вы случайно работаете с SQL Server, вот статья об обнаружении зависимостей на этой платформе: Finding Dependencies in SQL Server 2005
Я довольно поздно пришел на вечеринку, однако я подумал, что поделюсь регулярным выражением, которое я использую в настоящее время для анализа всех наших объектов базы данных, и я не согласен с мнением, что это невозможно сделать с его помощью.
Регулярное выражение имеет несколько допущений
1) Вы не используете стиль синтаксиса соединения A, B
2) Какой бы синтаксический анализатор регулярного выражения вы ни использовали, он поддерживает игнорирование регистра.
3) Вы анализируете, выбираете, объединяете, обновляете, удаляет и усекает. Он не поддерживает вышеупомянутые MERGE / NATURAL, потому что мы их не используем, однако я уверен, что дополнительную поддержку добавить не составит труда.
Мне интересно знать, частью какого типа транзакции является таблица, поэтому я включил группы именованного захвата, чтобы сообщить мне об этом.
Я давно не использую регулярные выражения, поэтому, вероятно, можно будет внести улучшения, но пока что во всех моих тестах это верно.
\bjoin\s+(?<Retrieve>[a-zA-Z\._\d]+)\b|\bfrom\s+(?<Retrieve>[a-zA-Z\._\d]+)\b|\bupdate\s+(?<Update>[a-zA-Z\._\d]+)\b|\binsert\s+(?:\binto\b)?\s+(?<Insert>[a-zA-Z\._\d]+)\b|\btruncate\s+table\s+(?<Delete>[a-zA-Z\._\d]+)\b|\bdelete\s+(?:\bfrom\b)?\s+(?<Delete>[a-zA-Z\._\d]+)\b