В базовой версии вы хотите игнорировать любой ;
, которому предшествует обратный слеш, независимо от чего-либо еще.Это относительно просто:
\s*([^;]*[^;\\]);
Что будет сложно, если вы хотите, чтобы экранированные обратные слэши во входных данных рассматривались как литералы.Например:
"You may want to split here\\;"
"But not here\;"
Если вы хотите принять это во внимание, попробуйте это (отредактировано) :
\s*((?:[^;\\]|\\.)+);
Почему так сложно?Потому что, если разрешены экранированные обратные слэши, вы должны учитывать такие вещи:
"0 slashes; 2 slashes\\; 5 slashes\\\\\; 6 slashes\\\\\\;"
Каждая пара удвоенных обратных слэшей будет рассматриваться как литерал \
.Это означает, что ;
будет экранирован только в том случае, если перед ним будет нечетное число обратной косой черты.Таким образом, вышеприведенный ввод будет сгруппирован следующим образом:
#1: '0 slashes'
#2: '2 slashes\'
#3: '5 slashes\\; 6 slashes\\\'
Отсюда и различные части шаблона:
\s* #Whitespace
((?:
[^;\\] #One character that's not ; or \
| #Or...
\\. #A backslash followed by any character, even ; or another backslash
)+); #Repeated one or more times, followed by ;
Требование символа после обратной косой черты гарантирует, что второй символ всегда будет экранированправильно, даже если это еще один обратный слеш.