[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Очередная проблема с регулярками
krasilich
Регулярное выражение должно совпадать с символом прямой черты | если она не находиться в квадратных скобках [ ]

Тоесть в строке str|ing[str|ing] должно быть только одно совпадение с первой прямой чертой.

Пробовал [^\[]+\| - не получаеться.



Спустя 16 минут, 50 секунд (1.03.2010 - 18:12) twin написал(а):
Что значит "совпадать с первой чертой"?
Результат покажи какой нужен.

Спустя 10 минут, 1 секунда (1.03.2010 - 18:22) krasilich написал(а):
даный regex используеться совместно с preg_split,
тоесть строку
str|ing[str|ing] 

нужно разбить на
str
и
ing[str|ing]

Спустя 2 часа, 26 минут, 32 секунды (1.03.2010 - 20:49) baston написал(а):
see_man
А такое выражение не подойдет?
(^[\w^\|]{3})

Найдет только первое вхождение до первой прямой черты.

Спустя 9 минут, 18 секунд (1.03.2010 - 20:58) baston написал(а):
А вот так вроде бы можно получить и вторую часть (исключая первую прямую черту):
(^[\w^\|]{3})(\|)([^\s]+)

Спустя 43 минуты, 31 секунда (1.03.2010 - 21:41) twin написал(а):
А если 4 символа? Я что то пока не представляю, как одним проходом можно разбить. Правда и подумать особо некогда.
Но задачка мне кажется не из простых.

Спустя 26 минут, 50 секунд (1.03.2010 - 22:08) baston написал(а):
Цитата (twin @ 1.03.2010 - 21:41)
А если 4 символа?

А это уже надо уточнять у автора. Я же брал конкретный пример его.

Спустя 8 минут, 12 секунд (1.03.2010 - 22:17) baston написал(а):
Ну, да. Мое решение совсем не идеал, согласен. Не ищет она, если таких выражений несколько в строке...

Спустя 28 минут, 4 секунды (1.03.2010 - 22:45) twin написал(а):
Если знать, сколько символов в строке, зачем вообще тогда регулярка?

Спустя 12 часов, 56 минут, 38 секунд (2.03.2010 - 11:41) baston написал(а):
twin, see_man.
Мне кажется, что вот такое выражение может подойти:
(\w+)((?=\|)[^\s]+)

В первом подвыражении у нас будет часть до первой прямой черты, а во втором - остальное (с певрой прямой чертой, правда).
Отпишитесь о результате. Самому уже интересно стало...

Поправил выражение, чтобы не забирало лишние символы после закрывающей прямоугольной скобки.

Спустя 12 минут, 25 секунд (2.03.2010 - 11:54) twin написал(а):
А если таких выражений в тексте несколько?

Цитата
strstr|ing[str|ing]str|inging[str|ing]str|ing[strstr|ing] 

Нет. Одним проходом тут вряд ли решить.

Спустя 3 минуты, 51 секунда (2.03.2010 - 11:57) baston написал(а):
Я тестировал с переносом строк. Надо подумать, если все вместе в одной строке...

Спустя 2 минуты, 23 секунды (2.03.2010 - 12:00) twin написал(а):
Задача стоит разбить строку, а не несколько строк. В том и затыка. smile.gif
Чесно говоря ничего кроме стека в голову не лезет почему то...

Спустя 3 минуты, 57 секунд (2.03.2010 - 12:04) baston написал(а):
Николай, мы пытаемся найти универсальное решение, не зная на самом деле, что из себя представляет эта строка (автор вопроса молчит).

Спустя 10 часов, 10 минут, 2 секунды (2.03.2010 - 22:14) krasilich написал(а):
Там еще пробдема в том что скобки, могут быть вложенными. Теоретически до n+1го уровня, где n это ооооооооочень много...

Спустя 3 часа, 35 минут, 22 секунды (3.03.2010 - 01:49) qpayct написал(а):
Если я правильно понял Т.С, надо искать "[" затем искать "|" и закрывающую "]". ну и повторять сей цикл.
Так?

Спустя 6 часов, 23 минуты, 46 секунд (3.03.2010 - 08:13) twin написал(а):
baston
Цитата
Николай, мы пытаемся найти универсальное решение, не зная на самом деле, что из себя представляет эта строка (автор вопроса молчит).

Из условий поставленной задачи вполне понятно что
1. Это строка
2. Количество символов различно (иначе зачем регулярка)
3. Нужно разбить по прямой черте, находящейся не внутри квадратных скобок.

Так что в принципе все ясно. Задача достаточно сложная, я недавно решал что то похожее.
Я делал стеком, то есть qpayct примерно на првильном пути. То есть нужно читать строку посимвольно. Заменяя попутно прямые черточки символом, который теоретически не должен встретиться в исходном тексте(токен своего рода). Если попалась открывающая скобка - плюс один в стек. Закрывающая - минус один. Пока стек не равен нулю - ничего не заменяем. А потом делим по этому символу.

Очень грубо так:
  $str = 'strstr|ing[st[r|in]g]str|inging[str|ing]str|ing[strstr|ing]';
$stack = 0;

for($i = 0; $i < strlen($str); $i++)
{
if($str[$i] == '[')
$stack++;
if($str[$i] == ']')
$stack--;

if(empty($stack) && $str[$i] == '|')
$str[$i] = '~';

}

$arr = explode('~', $str);

print_r($arr);

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.