Я использую preg_split php для разделения строки на основе точек с запятой, но мне нужен он, чтобы только разделить на незавершенных точках с запятой.
$str = "abc;def\\;abc;def";
$arr = preg_split("/;/", $str);
print_r($arr);
?>
Производит:
Array
(
[0] => abc
[1] => def\
[2] => abc
[3] => def
)
Когда я хочу, чтобы это произвело:
Array
(
[0] => abc
[1] => def\;abc
[2] => def
)
Я попробовал "/(^\\)?;/"
или "/[^\\]?;/"
но они оба производят ошибки. Какие-либо идеи?
Это работает.
<?
$str = "abc;def\;abc;def";
$arr = preg_split('/(?<!\\\);/', $str);
print_r($arr);
?>
Это выводит:
Array
(
[0] => abc
[1] => def\;abc
[2] => def
)
Вам необходимо использовать негативное окно (, прочитанный о Lookanounds ). Думать о «совпадении всех»; Разве не предшествует «\».
Большинство ответов здесь приводит к коллекции имен цветов (последовательностей) вместо объектов System.Drawing.Color. Если вам нужна коллекция фактических системных цветов, используйте следующее:
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
...
static IEnumerable<Color> GetSystemColors() {
Type type = typeof(Color);
return type.GetProperties().Where(info => info.PropertyType == type).Select(info => (Color)info.GetValue(null, null));
}
-121--3216792- Это может быть полезным.
-121--3010611-Так как Барт спрашивает: Конечно, вы также можете использовать регекс, чтобы разделить на unescaped; и учитывать ускользнувшие символы побега. Просто становится немного запутанным:
<?
$str = "abc;def\;abc\\\\;def";
preg_match_all('/((?:[^\\\\;]|\\\.)*)(?:;|$)/', $str, $arr);
print_r($arr);
?>
Array
(
[0] => Array
(
[0] => abc;
[1] => def\;abc\\;
[2] => def
)
[1] => Array
(
[0] => abc
[1] => def\;abc\\
[2] => def
)
)
Что это делает, так это взять регулярное выражение для «(любой символ, кроме\и;) или (\за которым следует любой символ)» и разрешить любое число из них, за которым следует; или конец последовательности.
Я не уверен, как php обрабатывает символы $ и конца строки в последовательности, возможно, вам потребуется задать некоторые параметры regex, чтобы получить именно то, что вы хотите для них.
Я не очень нефессию с PHP Regexes, но попробуйте этот:
/(?<!\\);/