Как найти пользовательскую строку между границами слов с помощью регулярных выражений JavaScript? - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть текст, который я ищу с помощью JavaScript. Я позволяю пользователю указать произвольную строку, затем я хочу найти эту строку с условием, что она рассматривается как «целые слова», то есть находится между границами слов.

Я просто хочу сказать, например,

var userString = "something blah";
// => "blah another thing blah"
"blah something blah blah".replace(new RegExp("\\b" + userString + "\\b"), "another thing"); 

// no match, good
"blahsomething blah blah".replace(new RegExp("\\b" + userString + "\\b"), "another thing");

userString = "something\\blah";

// want to match, but doesn't
"blah something\\blah blah".replace(new RegExp("\\b" + userString + "\\b"), "another thing");

Как вы можете видеть, он разбивается на специальные символы - мне нужен способ указать RegExp избегать пользовательского ввода или выделить часть выражения в качестве литерала. Возможно ли это в JavaScript?

Ответы [ 2 ]

1 голос
/ 02 ноября 2011
userString.replace(/([\[\]*+.?{}()\\^$])/g, "\\$1")
0 голосов
/ 02 ноября 2011

Вам нужно правильно избежать обратных слешей.Чтобы сопоставить одиночную обратную косую черту в регулярном выражении, вам нужно один раз экранировать ее, чтобы она принималась в качестве фактической обратной косой черты в регулярном выражении.И поскольку вы сохраняете регулярное выражение в виде строки, вам необходимо снова экранировать каждую из этих двух обратных косых черт, что приводит к \\\\.Таким образом, вы можете просто избежать косых черт в вашем userString:

userString = userString.replace(/\\/g, '\\\\');

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

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