1. JavaScript / Говнокод #21969

    +11

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    function nodash (s) {
      var re = /(.*)-(.*)-(.*)-(.*)-(.*)/;
      var a = re.exec(s);
      return a[1] + a[2] + a[3] + a[4] + a[5];
    }

    A typical filename in the system: 628f1ff3-0c96-4f4a-84a3-f5e29de2dfab.jpeg
    Experienced Unity developer writes a function to remove hyphens (props for naming) from the filename. Wow

    Запостил: eternalko, 12 Января 2017

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

    • Да, забавно наверное пооучилось когда попалось имя без букв. К такому Unity его не готовил.
      Ответить
      • Слаботипизированный питух стоит на страже и ждёт своего часа, чтобы клюнуть.
        Ответить
      • Безопасная версия четвёртой строки:
        return "" + a[1] + "" + a[2] + "" + a[3] + "" + a[4] + "" + a[5] + "";
        Ответить
        • Что? Регулярки возвращают строки или undefined в случае условной группофигни вроде /(.+)?/ В нашем случае либо exec вернёт null, либо будет пять строк (возможно, пустых). Сумма, где хоть один операнд - строка - строка (а у нас оба операнда строки).
          Слаботипизированный питух стоит на страже и ждёт своего часа, чтобы помочь.
          Ответить
          • > либо exec вернёт null, либо будет пять строк (возможно, пустых)
            > ждёт своего часа, чтобы помочь.

            Лул, Cannot read property '1' of null. Шпасибки, динамический питушок, выручил.
            Ответить
            • Мда... Всё падает как в лучших домах питона.
              Ну а как вообще без null определить, что шаблон не натянулся?

              Хотя, надо бы опцию вводить "матчить всё, что можно, пустые строки, если не заматчилось". В случае простых регулярок как в нашем случае бы сильно помогло разработке.
              Ответить
              • "Полезный" динамопитух, кмк, должен выглядеть как-то так (ахтунг, браузерозависимые расширения)
                var EmptyArray = new Proxy({}, {
                  get: function(proxy, name) {
                    return '';
                  }
                });
                
                function rexec(regex, str) {
                  var result = regex.exec(str);
                  return (result == null) ? EmptyArray :
                      new Proxy(result, {
                        get: function(res, name) {
                          if (name in res) return res[name];
                          return '';
                        }
                      });
                }
                Ответить
                • Надо бы только index, input, length в EmptyArray добавить, чтоб ничего не падало. И ещё, возможно, флаг(и) matched/fullyMatched во все результаты.

                  Отдельный вопрос - что делать в пустом случае при for(x=1; x<result.length; x++).

                  Ну и как undefined отличать от '', если мы вздумали запоминать, возможно, пустые префиксы/постфиксы:
                  > /\d(\d*)|A(\d*)$/.exec('3')
                  ["3", "", undefined]
                  > /\d(\d*)|A(\d*)$/.exec('A')
                  ["A", undefined, ""]
                  Ответить
            • Запустил код в браузере, re.exec("----") вернуло Array [ "----", "", "", "", "", "" ].
              Никакого нулла нету.

              Блин, не так понял коммент. Снимаю возражение.
              Ответить
      • Как там было?
        True fortran programmers can write fortran in any language.
        Ответить
    • function nodash2 (s) {
        var re = /(.*)-(.*)-(.*)-(.*)-(.*)-(.*)/;
        var a = re.exec(s);
        return a[1] + a[2] + a[3] + a[4] + a[5] + a[6];
      }
      //
      function nodash4 (s) {
        var re = /(.*)-(.*)-(.*)-(.*)-(.*)-(.*)-(.*)-(.*)/;
        var a = re.exec(s);
        return a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8];
      }


      А потом он уволился
      Ответить
      • function nodashN (s, n) {
          n += 4;
          var r = ""
          for (var i = 0; i < n - 1; i++) {
              r += "(.*)-";
          }
          r += "(.*)";
          var re = new RegExp(r);
          var a = re.exec(s);
          var res = ""
          for (var i = 1; i <= n; i++) {
              res += a[i];
          }
          return res;
        }

        [/color]
        Ответить
        • function nodashN(s, n) {
            return (function createNodashN(n) {
              if(n == 1) return nodash;
              return eval('(' + String(createNodashN(n-1))
                .replace('/;', '-(.*)/;')
                .replace('];', '] + a[' + (n+4) + '];') + ')');
            })(n)(s);
          }
          Ответить

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