Тоесть в строке 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 написал(а):
Задача стоит разбить строку, а не несколько строк. В том и затыка.
Чесно говоря ничего кроме стека в голову не лезет почему то...
Чесно говоря ничего кроме стека в голову не лезет почему то...
Спустя 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);