1. Куча / Говнокод #18687

    +1

    1. 1
    [\s\S]+?

    Запостил: 3_14dar, 08 Сентября 2015

    Комментарии (53) RSS

    • А что не так?
      Ответить
      • Подсказка: отгадайте, что не так в следующем коде.
        if ((x <=0 || x > 0) || true) { ... }
        Ответить
        • если вас смущает \s\S и вы бы хотели написать там точку, то это не заработает в некоторых случаях. Например точка не заматчится на \n.
          Ответить
      • Вопрос правомерный. Чем оно отличается от ".+?"? Может, в плане \r\n? Использовалось в re.search в питоне без флагов.
        Ответить
        • +2 и ни одного ответа. Оно таки матчит \r\n? Проверил - таки да, т.е. это замена флагу re.MULTILINE.
          Ответить
        • 3_14dar, иди напитон, пидар!
          Ответить
      • То, что это преступление против логики.
        Ответить
        • Я там чутка повыше дал объяснение зачем так делать
          Ответить
          • Надо multiline флаг поставить и все.
            Ответить
            • Но во всеми любимом JS это не поможет. Хз почему, но вот только что проверил в последней версии хрома.
              Ответить
              • Ну этот кусок был из питона. А что, в js нет multiline флага?
                Ответить
                • Есть. но он не работает)
                  UPD: или работает, но я не знаю регекспов. я тестил вот такой строчкой "/^a.*b$/m.test('a\nb')"
                  Ответить
                  • Флаг работает, но не так:
                    > /^ololo$/.test('ololo\ntrololo')
                    false
                    > /^ololo$/m.test('ololo\ntrololo')
                    true
                    > /^ololo$/m.test('trololo\nololo')
                    true
                    Ответить
          • А что, по другому это нельзя написать?
            Ответить
            • Можно использовать флаг multiline, но он меняет своё поведение при появлении символов ^ и $. Вот в этом коде "/^a.*b$/m.test('a\nb')" регексп не сработает, а вот этот регексп- "/^a[\s\S]*b$/.test('a\nb')" - сматчится.
              Ответить
              • \A \Z?
                Ответить
                • В том же JS я не нашёл упоминания об этом. В других языках эта пара действительно будет делать то, что надо.
                  Ответить
                  • http://www.regular-expressions.info/anchors.html#az

                    There is indeed no /s modifier to make the dot match all characters, including line breaks. To match absolutely any character, you can use character class that contains a shorthand class and its negated version, such as [\s\S].

                    JavaScript, POSIX, XML, and XPath do not support \A and \Z. You're stuck with using the caret and dollar for this purpose.

                    Enjoy your js
                    Ответить
                    • :( Остаётся верить в светлое будущее. Ретроспективной проверки тоже очень не хватает
                      Ответить
                      • >Ретроспективной проверки
                        Что это?
                        Ответить
                        • Возможноть посмотреть "назад" в регекспе. Например, /(?<=s)b*/ сматчися на строчку 'sbbb' но вытянет от туда 'bbb'
                          Ответить
                          • Например, если строчка является урлом, и надо выдрать то, что стоит после Http. Это можно провернуть например так /^(?>=https?:).*/
                            Ответить
                            • https?://(.+)
                              ?

                              То что ты предложил прекрасно заменяется скобками.
                              Ответить
                              • как вариант.
                                Ответить
                              • Я просто показал способ пример использования. Конкретно в данном случае можно обойтись и скобками, но есть случаи, когда хотелось бы иметь и ретроспективу
                                Ответить
                                • Например?
                                  Ответить
                                  • В голову мне приходят только искусственные примеры.. Например, надо разбить строку "a, b,c" на ["a,", "b,", "c"]. То есть оставить запятую, после буквы, но убирать одинарные пробелы если они есть. На, например, Ruby это запишется как "a, b,c".split(/?(>=,)\s?/)
                                    Ответить
                                  • Duplicate
                                    Ответить
                          • а ты что хочешь?
                            Ответить
              • /^a(\n|\r)*b$/.test('a\nb')


                ?
                Ответить
                • > /^a.*b$/.test('a\nb')
                  false
                  Ответить
                • да, это будет работать. но [\s\S] короче на один символ)
                  Ответить
                  • Не будет же, если надо чтобы . матчил переводы строк
                    Ответить
                    • но мы то тут костыли всякие придумываем, так что не в точке дело)
                      Ответить
                      • Костыли чтобы матчить . включая переводы строк же?
                        Ответить
                        • что бы точка матчила переводы строк достаточно \A\z и multiline флага. Все адекватные языки программирования это поддерживают. А по другому заставить точку делать вышеописанное нельзя. И вот тут вступают в дело костыли с [\s\S]
                          Ответить
                          • >Все адекватные языки программирования это поддерживают.
                            В этом проблема?
                            Ответить
    • И еще ведь +? можно заменить на *, или тут тоже будут... нюансы?
      Ответить
      • Нельзя. Знак вопроса после знака повтора отменяет его жадность.
        Ответить
      • +?, даже если бы это не было комбинашкой, все равно был бы +
        Ответить
        • А если бы у бабушки была борода, она была бы дедушкой?

          И всё-таки нет. Чтобы это не было комбинашкой, надо поставить скобки:
          (шаблон+)?

          Тесты показывают, что это работает... как звёздочка.

          Плюсик — сокращение для {1,}
          Знак вопроса — сокращение для {0,1}
          {1,} × {0,1} = {1,} × 0 + {1,} x 1 = {0} + {1,} = {0,} — сокращение для звёздочки.

          ******

          А без скобочек надо помнить, что +? и *? — это диграфы для «нежадных» операторов.
          Ответить
          • Оно у тебя умножается, а если бы складывалось - был бы плюсик.
            Ответить
          • {0} + {1,} = {0,}

            Какая-то у тебя странная форма записи.
            Ответить
        • Если бы +? был комбинацией это был бы как раз * ИМХО пересечение логичнее объединения
          Ответить
          • Тут без гаданий и без ИМХО всё решается.
            Ответить
            • так то тут без гадания ленивый квантификатор. Я не про скобки, я о том, если бы была такая возможность как сочитание квантификаторов, то она работала бы на умножение - ибо логично
              Ответить
              • > если бы была такая возможность как сочитание квантификаторов
                То регулярки были бы ещё более write-only, монструознее и упоротей.
                Впрочем, кому я это говорю... Человек на Ж пишет.
                Ответить

    Добавить комментарий