Самый быстрый метод для замены всех экземпляров символа в строке

Проблема в том, что PS почему-то разбирает -Dresourcepath=. иначе, чем cmd. Что работает

java -cp '.;.\common.jar' -Dcontext=atest1 "-Dresourcepath=." DW_Install

Не имеет значения, в каком направлении идет слэш, и не имеет значения, какие кавычки используются (' или "). Однако путь класса должен быть экранирован какими-то кавычками. Хороший тест, чтобы понять, что получает переводчик PS, - это повторить его. Следующее:

echo java -cp '.;.\common.jar' -Dcontext=atest1 -Dresourcepath=. DW_Install

выводит следующий результат:

java
-cp
.;.\common.jar
-Dcontext=etaste1
-Dresourcepath=
.
DW_Install

(Обратите внимание, что путь ресурса и значение пути к ресурсу не находятся в одной строке.) Если вывод в

echo java -cp '.;.\common.jar' -Dcontext=atest1 '-Dresourcepath=.' DW_Install

дает следующий результат:

java
-cp
.;.\common.jar
-Dcontext=etaste1
-Dresourcepath=.
DW_Install

Это намного больше по душе.

Хотя я этого не желаю никому из вас, я надеюсь что этот пост помогает тем из вас, которые должны развертывать java-проекты на компьютерах Windows (хотя они никогда не будут работать на какой-либо другой платформе).

574
задан thorn̈ 5 September 2018 в 16:43
поделиться

5 ответов

-

Самый простой будет использовать регулярное выражение с флагом G для замены всех экземпляров:

str.replace(/foo/g, "bar")

Это заменит все вхождения foo с Бар в строке str . Если у вас просто есть строка, вы можете преобразовать его в объект Regexp, как это:

var pattern = "foobar",
    re = new RegExp(pattern, "g");
1052
ответ дан 22 November 2019 в 21:55
поделиться

Я просто кодировал сравнительный тест и протестировал первые 3 ответа. Кажется этим для коротких строк (< 500 символов)
третий самый проголосовавший ответ быстрее, чем второй самый проголосовавший.

Для длинных строк (добавляют ".repeat (300)" к тестовой строке) быстрее ответ 1 сопровождаемый вторым и третьим.

Примечание:

Вышеупомянутое верно для браузеров с помощью v8 механизм (хром/хром и т.д.).
С Firefox (механизм SpiderMonkey) результаты полностью отличающиеся
Проверка сами!! Firefox с третьим решением, кажется,
больше чем в 4.5 раза быстрее, чем Chrome с первым решением... сумасшедшим :D

function log(data) {
  document.getElementById("log").textContent += data + "\n";
}

benchmark = (() => {

  time_function = function(ms, f, num) {
    var z;
    var t = new Date().getTime();
    for (z = 0;
      ((new Date().getTime() - t) < ms); z++) f(num);
    return (z / ms)
  } // returns how many times the function was run in "ms" milliseconds.


  function benchmark() {
    function compare(a, b) {
      if (a[1] > b[1]) {
        return -1;
      }
      if (a[1] < b[1]) {
        return 1;
      }
      return 0;
    }

    // functions

    function replace1(s) {
      s.replace(/foo/g, "bar")
    }

String.prototype.replaceAll2 = function(_f, _r){ 

  var o = this.toString();
  var r = '';
  var s = o;
  var b = 0;
  var e = -1;
//      if(_c){ _f = _f.toLowerCase(); s = o.toLowerCase(); }

  while((e=s.indexOf(_f)) > -1)
  {
    r += o.substring(b, b+e) + _r;
    s = s.substring(e+_f.length, s.length);
    b += e+_f.length;
  }

  // Add Leftover
  if(s.length>0){ r+=o.substring(o.length-s.length, o.length); }

  // Return New String
  return r;
};

String.prototype.replaceAll = function(str1, str2, ignore) {
      return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, "\\[110]amp;"), (ignore ? "gi" : "g")), (typeof(str2) == "string") ? str2.replace(/\$/g, "$$") : str2);
    }

    function replace2(s) {
      s.replaceAll("foo", "bar")
    }

    function replace3(s) {
      s.split('foo').join('bar');
    }

    function replace4(s) {
      s.replaceAll2("foo", "bar")
    }


    funcs = [
      [replace1, 0],
      [replace2, 0],
      [replace3, 0],
      [replace4, 0]
    ];

    funcs.forEach((ff) => {
      console.log("Benchmarking: " + ff[0].name);
      ff[1] = time_function(2500, ff[0], "foOfoobarBaR barbarfoobarf00".repeat(10));
      console.log("Score: " + ff[1]);

    })
    return funcs.sort(compare);
  }

  return benchmark;
})()
log("Starting benchmark...\n");
res = benchmark();
console.log("Winner: " + res[0][0].name + " !!!");
count = 1;
res.forEach((r) => {
  log((count++) + ". " + r[0].name + " score: " + Math.floor(10000 * r[1] / res[0][1]) / 100 + ((count == 2) ? "% *winner*" : "% speed of winner.") + " (" + Math.round(r[1] * 100) / 100 + ")");
});
log("\nWinner code:\n");
log(res[0][0].toString());
<textarea rows="50" cols="80" style="font-size: 16; resize:none; border: none;" id="log"></textarea>

, тест будет работать в течение многих 10-х (+2s), поскольку Вы нажимаете кнопку.

Мои результаты (на том же ПК):

Chrome/Linux Ubuntu 64:
1. replace1 score: 100% *winner* (766.18)
2. replace4 score: 99.07% speed of winner. (759.11)
3. replace3 score: 68.36% speed of winner. (523.83)
4. replace2 score: 59.35% speed of winner. (454.78)

Firefox/Linux Ubuntu 64
1. replace3 score: 100% *winner* (3480.1)
2. replace1 score: 13.06% speed of winner. (454.83)
3. replace4 score: 9.4% speed of winner. (327.42)
4. replace2 score: 4.81% speed of winner. (167.46)

Хорошая путаница мм?

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

Chrome/Windows 10
1. replace1 score: 100% *winner* (742.49)
2. replace4 score: 85.58% speed of winner. (635.44)
3. replace2 score: 54.42% speed of winner. (404.08)
4. replace3 score: 50.06% speed of winner. (371.73)

Firefox/Windows 10
1. replace3 score: 100% *winner* (2645.18)
2. replace1 score: 30.77% speed of winner. (814.18)
3. replace4 score: 22.3% speed of winner. (589.97)
4. replace2 score: 12.51% speed of winner. (331.13)

Edge/Windows 10
1. replace1 score: 100% *winner* (1251.24)
2. replace2 score: 46.63% speed of winner. (583.47)
3. replace3 score: 44.42% speed of winner. (555.92)
4. replace4 score: 20% speed of winner. (250.28)

Chrome на Galaxy Note 4

1. replace4 score: 100% *winner* (99.82)
2. replace1 score: 91.04% speed of winner. (90.88)
3. replace3 score: 70.27% speed of winner. (70.15)
4. replace2 score: 38.25% speed of winner. (38.18)
0
ответ дан 22 November 2019 в 21:55
поделиться
1785664-

Что самое быстрее, я не знаю, но я знаю, что самое читаемое - это то, что самое кратчайшее и простые. Даже если это немного медленнее, чем другое решение, это стоит использовать.

Итак, используйте:

 "string".replace("a", "b");
 "string".replace(/abc?/g, "def");

и наслаждайтесь хорошим кодом, а не быстрее (ну ... 1/100000 сек. Это не разница) и уродливый. ;)

5
ответ дан 22 November 2019 в 21:55
поделиться
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");

NewString ныне сейчас «Тас как стран»

84
ответ дан 22 November 2019 в 21:55
поделиться

Используйте метод заменить () строки объекта.

Как уже упоминалось в выбранном ответе, флаг / г должен использоваться в Regex, чтобы заменить всех экземпляров подстроки в строке.

2
ответ дан 22 November 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: