При определении наилучшего шаблона для вашего проекта вам необходимо учитывать следующие факторы шаблона:
- Точность (робастность) - является ли шаблон корректным во всех случаях и является ли он разумным в будущем.доказательство
- Эффективность - шаблон должен быть прямым, преднамеренным и избегать ненужной работы
- Краткость - шаблон должен использовать соответствующие методы, чтобы избежать ненужной длины символов
- Читабельность -- шаблон должен быть максимально простым
Вышеперечисленные факторы также оказываются в иерархическом порядке, который стремиться подчиняться.Другими словами, для меня не имеет большого смысла расставлять приоритеты 2, 3 или 4, когда 1 не совсем удовлетворяет требованиям.Для меня читаемость находится внизу списка, потому что в большинстве случаев я могу следовать синтаксису.
Группы захвата и Lookarounds часто влияют на эффективность шаблона.Правда в том, что если вы не выполняете это регулярное выражение для тысяч входных строк, вам не нужно трудиться над эффективностью.Возможно, более важно сосредоточиться на удобочитаемости шаблона, который может быть связан с краткостью шаблона.
Некоторые шаблоны ниже потребуют некоторой дополнительной обработки / пометки с помощью их функции preg_
, но вот некоторые сравнения шаблонов, основанные наПример ввода OP:
preg_split()
шаблоны:
/^[^A-Z]+\K|[A-Z][^A-Z]+\K/
(21 шаг) /(^[^A-Z]+|[A-Z][^A-Z]+)/
(26 шагов) /[^A-Z]+\K(?=[A-Z])/
(43 шага) /(?=[A-Z])/
(50 шагов) /(?=[A-Z]+)/
(50 шагов) /([a-z]{1})[A-Z]{1}/
(53 шага) /([a-z0-9])([A-Z])/
(68 шагов) /(?<=[a-z])(?=[A-Z])/x
(94 шага) ... для записи, x
бесполезен. /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/
(134 шага)
preg_match_all()
шаблоны:
/[A-Z]?[a-z]+/
(14 шагов) /((?:^|[A-Z])[a-z]+)/
(35 шагов)
Я укажу, что есть небольшая разница между выходными значениями preg_match_all()
и preg_split()
.preg_match_all()
выведет 2-мерный массив, другими словами, все совпадения полной строки будут находиться в подмассиве [0]
;если используется группа захвата, эти подстроки будут находиться в подмассиве [1]
.С другой стороны, preg_split()
выводит только одномерный массив и, следовательно, обеспечивает менее раздутый и более прямой путь к желаемому выводу.
Некоторые шаблоны недостаточны при работе со строками camelCase, которые содержатALLCAPS / аббревиатура в них.Если это ограниченный случай, который возможен в вашем проекте, логично рассматривать только шаблоны, которые правильно обрабатывают эти случаи.Я не буду тестировать входные строки TitleCase, потому что это слишком далеко от вопроса.
Новая расширенная батарея тестовых строк:
oneTwoThreeFour
hasConsecutiveCAPS
newNASAModule
USAIsGreatAgain
Подходит preg_split()
выкройки:
/[a-z]+\K|(?=[A-Z][a-z]+)/
(149 шагов) * Мне пришлось использовать [a-z]
, чтобы демо правильно посчитало /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/
(547 шагов)
Подходящий preg_match_all()
шаблон:
/[A-Z]?[a-z]+|[A-Z]+(?=[A-Z][a-z]|$)/
(75 шагов)
Наконец, мои рекомендации основаны на моих принципах шаблонов / иерархии факторов.Кроме того, я рекомендую preg_split()
более preg_match_all()
(несмотря на то, что шаблоны имеют меньше шагов) в качестве непосредственного элемента к желаемой структуре вывода.(конечно, выбирайте что хотите)
Код: ( Демо )
$noAcronyms = 'oneTwoThreeFour';
var_export(preg_split('~^[^A-Z]+\K|[A-Z][^A-Z]+\K~', $noAcronyms, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_match_all('~[A-Z]?[^A-Z]+~', $noAcronyms, $out) ? $out[0] : []);
Код: ( Демо )
$withAcronyms = 'newNASAModule';
var_export(preg_split('~[^A-Z]+\K|(?=[A-Z][^A-Z]+)~', $withAcronyms, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_match_all('~[A-Z]?[^A-Z]+|[A-Z]+(?=[A-Z][^A-Z]|$)~', $withAcronyms, $out) ? $out[0] : []);