На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > regexp , возможность отсутствия строки :)
      Есть вот такое выражение:
      ExpandedWrap disabled
        .*\d{4}\*{3}(\d{4});(.*):([\d\.]+)(.{3}).;?Остаток:([\d\.]+).(.{3}).;?Место:(.*);?([\d\.]+\s[\d:]+).*

      Проблема в том что выражение Место:(.*);? может вообще отсутствовать (и тогда вместо .* должна передаваться пустая строка). Вопросительный знак относится только к одному символу, а если поставить круглые скобки, то выражение будет выделено (и занесено в присваиваемую переменную), а этого никак допустить нельзя.
      Как тогда это описать?
        Jin X

        если поставить круглые скобки, то выражение будет выделено (и занесено в присваиваемую переменную), а этого никак допустить нельзя.

        Присобачить, очевидно, non-capturing group
          А если чуть поподробнее? Как это будет выглядеть? :huh:
            ExpandedWrap disabled
              (?:.*)
                Т.е. вот так прокатит? Выделено красным:
                ExpandedWrap disabled
                  .*\d{4}\*{3}(\d{4});(.*):([\d\.]+)(.{3}).;?Остаток:([\d\.]+).(.{3}).;?(?:Место:(.*);?)|()([\d\.]+\s[\d:]+).*


                Добавлено
                Т.е. или (?:Место:(.*);?) или () :whistle:
                Или где-то косяк есть? :huh:
                  Цитата
                  ;?(?:Место:(.*);?)|()([

                  нет, правильней так
                  ;?(?:Место:.*;)?([
                    Adil, ну здесь же у тебя захвата вообще нет!
                    Если присутствует строка "Место:", то нужно захватить .* (весь текст после него до точки с запятой (если она есть) и цифр - см. первый пост), а если отсутствует, то пустую стрку.
                      Jin X

                      Если присутствует строка "Место:", то нужно захватить .* (весь текст после него до точки с запятой (если она есть) и цифр - см. первый пост), а если отсутствует, то пустую стрку.

                      (?<=Место:)([^;]+;?)
                        Rififi, хм... а куда в твоём случае денется текст «Место:»? Ведь между (?<= и предыдущим выражением ничего нет вообще. И [^;]+ тут не в кассу, т.к. + предполагает наличие хотя бы одного символа. А его может и не быть. Хотя, это повод задуматься: а не заменить ли .* во многих местах на [^;]* ??? Хотя, с другой стороны, зачем, если и так всё работает? :)

                        А может, можно так сделать?
                        ExpandedWrap disabled
                          (?:Место:(.*);?|())
                        или:
                        ExpandedWrap disabled
                          (?:Место:)?(.*);?
                        (и как лучше?)

                        Добавлено
                        Вопрос вот в чём (по варианту Rififi).
                        Если, например, имеется строка "abc1234567890def", то выражение "(a..)(?<=90)(*)" вернёт в первую переменную "abc", а во вторую "def"? Несмотря на то, что 12345678 не описано вообще, а 90 только в (?<=…)?
                          Jin X

                          а куда в твоём случае денется текст «Место:»? Ведь между (?<= и предыдущим выражением ничего нет вообще

                          читай документацию по инструменту которому пользуешься, или переходи на что-нибудь попроще.

                          выражение "(a..)(?<=90)(*)" вернёт в первую переменную "abc", а во вторую "def"?

                          это выражение прежде всего невалидное.
                          но даже если имелось в виду (a..)(?<=90)(.*) то на тексте abc1234567890def совпадений не будет. если у тебя есть - вероятно это поддельный пёрл :lol:
                            Я не проверял :) А почему не будет? :huh:
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0424 ]   [ 15 queries used ]   [ Generated: 27.04.24, 16:52 GMT ]