LINUX.ORG.RU

помогите составить регексп

 ,


0

1

голова уже не варит, поэтому спрошу здесь

задача: взять из строки все до первой незаэскейпленой кавычки

пример (возможно не совсем валидный), но идея должна быть понятна.

строка

http://1.com/2.php?p\"aram=3#anchor" # that"s a page

результат

http://1.com/2.php?p\"aram=3#anchor

★★★★★

Последнее исправление: ZuBB (всего исправлений: 1)
Ответ на: комментарий от anonymous

пример не совсем валидный

повторяю урл здесь тупо как пример

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от anonymous

да, я знаю. сей такс к webdev'у не имеент никакого отношения

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от user_2190

я так и не понял как оно работает.. :(

что бы получить то что я хочу что в руби что в JS пришлось заменить «*» на «+»

"\"http://1.com/2.php?p\\\"aram=3#anchor\" # this i\"s page".match(/((\\"|[^"])+?)"/)
["http://1.com/2.php?p\"aram=3#anchor"", "http://1.com/2.php?p\"aram=3#anchor", "r"]

irb(main):042:0* a
=> "\"http://1.com/2.php?p\\\"aram=3#anchor\" # this i\"s page"
irb(main):043:0> a.match(/((\\"|[^"])+?)"/)
=> #<MatchData "http://1.com/2.php?p\\\"aram=3#anchor\"" 1:"http://1.com/2.php?p\\\"aram=3#anchor" 2:"r">
irb(main):044:0> 

но я так и не понял

  • зачем здесь «+?»
  • почему нельзя обойтись лишь «*»? то есть вот этим
    ((\\"|[^"])*)"
    
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

В показанных примерах оригинальная строка заменяется найденной подстрокой, а тебе достаточно только найти подстроку.

gatsu
()
Ответ на: комментарий от gatsu

это я понял, а вот почему нельзя только «*» я не понял. рассуждаю так

((\\"|[^"])*)"
  • взять экранированою скобку или любой символ кроме скобки
  • предыдущий символ может повторяться 0 или больше раз
  • запомнить все
  • остановится на скобке
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

Всё правильно.

$ php -a
Interactive shell

php > preg_match('#((\"|[^"])*)"#', 'aa\"bb"cc', $m);
php > print_r($m);
Array
(
    [0] => aa\"bb"
    [1] => aa\"bb
    [2] => b
)
gatsu
()

Тут нужно знать общую картину, чтобы другой код не подцепить, н овот это будет работать в данном частном случае, как надо

$link = "http://1.com/2.php?p\"aram=3#anchor" # that"s a page";
$link =~ m|(http:\S+)"\s+|i;
print "$1";

doomgl
()
Ответ на: я так и не понял как оно работает.. :( от ZuBB

Если бы не Ruby или JS, то, при обязательности наличия незаэксейпленной кавычки, можно было бы вот так

.+(?=(?<!\\)")

либо так, при необязательности её наличия:

([^"]+|((?<=\\)"))+

Так что, задавая где угодно вопрос про регекспы, указывайте используемый диалект

Uter
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.