Javascript string regex /.*/gm не перехватывает всю строку сразу - PullRequest
5 голосов
/ 01 марта 2012

Почему javascript заменяет строковую функцию?

"aaa\nbbb\nccc".replace(/.*/gm, ".")
// result = "..\n..\n.." but expected was: ".\n.\n."

"aaa\nbbb\nccc".replace(/^.*/gm, ".")
// result = ".\n.\n." -> OK!!!

"aaa\nbbb\nccc".replace(/.*$/gm, ".")
// result = "..\n..\n.." but expected was: ".\n.\n."

Что я делаю не так?

Ответы [ 3 ]

6 голосов
/ 01 марта 2012

Позвольте мне обратиться к ним в обратном порядке:

Что я делаю не так?

Вы хотите использовать +, а не *.* означает ноль или более совпадений, что здесь не имеет смысла.+ означает один или несколько совпадений .Итак:

"aaa\nbbb\nccc".replace(/.+/g, ".")
// ".\n.\n."

Также обратите внимание, что если вы не используете ^ или $ (ваш первый пример), вам не нужен модификатор m (но это был непроблема с тем что ты делал).И вам не нужно ^ или $, потому что . не соответствует символам новой строки (что я не знал до ответа на этот вопрос).

Почему javascript заменяет строковую функцию?

У меня нет никаких земных идей, и я надеюсь, что кто-то другой делает.

Опять же, используя *говорите ноль или более совпадений.Таким образом, он соответствует всем соответствующим символам, заменяя их первой точкой;затем он соответствует нулю символов, заменяя их одной точкой.Результат: две точки.

Пруф:

Живая копия | Живой источник

"aaa\nbbb\nccc".replace(/.*/g, function(m) {
    console.log("m = '" + m + "'");
});

Выходы:

m = 'aaa'
m = ''
m = 'bbb'
m = ''
m = 'ccc'
m = ''
3 голосов
/ 01 марта 2012

Посмотрите на эту инструкцию:

"aaa\nbbb\nccc".replace(/(.*)/gm, ".$1.")

производит:

".aaa...
.bbb...
.ccc..."

.* соответствует aaa и заменяет его на .aaa., затем соответствует пустой строке и заменяет ...

То же поведение при замене .* на .

Как сказал Т.Дж. Crowder, используйте этот вместо: .+

"aaa\nbbb\nccc".replace(/.+/g, ".")
1 голос
/ 01 марта 2012

Удивительно, но поведение ожидается.Пустая строка удовлетворяет регулярному выражению .*:

/.*/.test("");
// true

/.*/.exec("");
// [""]

Чтобы понять, что происходит, обратите внимание на вывод:

"aaa\nbbb\nccc".match(/.*/g);
// ["aaa", "", "bbb", "", "ccc", ""]
// m flag dropped because ^ and $ are not used

Помня, что . не соответствует\n, замена совпадений выполняется следующим образом:

  • .* совпадений aaa
  • из-за флага g, поиск строки после aaaдля совпадения
    • .* совпадения "" - строка нулевой длины после aaa и до \n
    • .* не совпадает \n
    • .* соответствует bbb
    • .* соответствует "" - строка нулевой длины после bbb и до \n

и так далее.Просто используйте .+, чтобы избежать совпадения пустых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...