Regex не работает для нескольких персонажей - PullRequest
2 голосов
/ 27 марта 2020

Я хочу найти и заменить специальные символы уценки (то есть \`*_{}[]()#+.!|-) из заданной строки.

Я могу легко заставить его работать в C#, так как дословно @ но Javascript не понимаю, в чем проблема. Кажется, что-то связано с /g, я читал в другом посте, в котором просили использовать replaceAll, но я не смог найти этот метод для string

C# версия

string test = @"B 
*H*
C
**AB**";
Console.WriteLine ("Input    " + test);

var pattern = @"[\\`*_{}\[\]()#+-.!]";
var _1 = Regex.Replace (test, "\r?\n", "<br/>");
var out_ = Regex.Replace (_1, pattern, m => @"\" + m.Value);
Console.WriteLine ("Output   " + out_);

машинописная версия

const regexM = new RegExp(/[\\\`\*\_\{\}\[\]\(\)#\+-\.!\|]/g, 'm');

var input = `B 
*H*
C
**AB**`;

var inputString = input.replace(regexM, function (y: any) { return "\\" + y; });

if (/\r|\n/.exec(inputString))
{
    inputString = inputString .replace(/\r?\n/g, "<br/>");
}

inputString = inputString.replace(regexM, function (x: any)
{
    return "\\" + x;
});

Ожидается: B <br/>\*H\*<br/>C<br/>\*\*AB\*\*

Я получаю B <br/>\*H*<br/>C<br/>**AB**

1 Ответ

1 голос
/ 27 марта 2020

Вы можете использовать

const regexM = /[\\`*_{}[\]()#+.!|-]/g;

var input = `B 
*H*
C
**AB**`;

var inputString = input.replace(regexM, "\\$&");
inputString = inputString.replace(/\r?\n/g, "<br/>");
console.log(inputString);
// => B <br/>\*H\*<br/>C<br/>\*\*AB\*\*

ПРИМЕЧАНИЕ:

  • - в регулярном выражении regexM образует диапазон, вам нужно либо экранировать его, либо - как в приведенный выше код - поместите его в конец класса символов
  • Вместо того, чтобы использовать методы обратного вызова, для ссылки на все совпадение вы можете использовать заполнитель $& в шаблоне замены строки
  • Когда вы определяете регулярное выражение с помощью литерала регулярного выражения, для формирования экранирования регулярного выражения требуется только одна обратная точка sh, поэтому const regexM = /[\\`*_{}[\]()#+.!|-]/g равно const regexM = new RegExp("[\\\\`*_{}[\\]()#+.!|-]", "g")
  • Нет необходимости проверять, есть символ разрыва строки или нет с if (/\r|\n/.exec(inputString)), просто запустите .replace.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...