Regex для разделения на всех незавершенных точках с запятой

Я использую preg_split php для разделения строки на основе точек с запятой, но мне нужен он, чтобы только разделить на незавершенных точках с запятой.


Производит:

Array
(
    [0] => abc
    [1] => def\
    [2] => abc
    [3] => def
)

Когда я хочу, чтобы это произвело:

Array
(
    [0] => abc
    [1] => def\;abc
    [2] => def
)

Я попробовал "/(^\\)?;/" или "/[^\\]?;/" но они оба производят ошибки. Какие-либо идеи?

5
задан Corey Hart 3 February 2010 в 23:41
поделиться

3 ответа

Это работает.

<?
  $str = "abc;def\;abc;def";
  $arr = preg_split('/(?<!\\\);/', $str);
  print_r($arr);
?>

Это выводит:

Array
(
    [0] => abc
    [1] => def\;abc
    [2] => def
) 

Вам необходимо использовать негативное окно (, прочитанный о Lookanounds ). Думать о «совпадении всех»; Разве не предшествует «\».

5
ответ дан 14 December 2019 в 08:51
поделиться

Большинство ответов здесь приводит к коллекции имен цветов (последовательностей) вместо объектов 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, чтобы получить именно то, что вы хотите для них.

0
ответ дан 14 December 2019 в 08:51
поделиться

Я не очень нефессию с PHP Regexes, но попробуйте этот:

/(?<!\\);/
2
ответ дан 14 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: