RegExp заменить точное ИЛИ похожее слово JS - PullRequest
1 голос
/ 19 апреля 2020

Я борюсь с Regex, чтобы заменить имя переменной внутри строки ...

Мне нужно поместить определенное имя переменной вне кавычек, и, , если эта переменная иметь спецификатор (например, свойство или метод), этот классификатор также должен быть вне кавычек в итоговой строке.

Итак, учитывая этот пример:

cExp = new RegExp('oErro', 'g');
cMsg = "Error ocurred: oErro; please try again";
cMsg.replace(cExp, '\' + oErro + \'')

вывод точно что я ожидаю:

'Произошла ошибка:' + oErro + '; пожалуйста, попробуйте еще раз '

Я ищу, как включить любые слова после имени переменной, и в итоге получился следующий фрагмент кода:

cExp = new RegExp('oErro(\.[^\ |^\;|^\,|^\)|^\}]*)', 'g');
cMsg = "Error ocurred: oErro.message; please try again";
cMsg.replace(cExp, '\' + oErro$1 + \'')

, и результат в точности соответствует тому, что я Ожидается увидеть:

'Произошла ошибка:' + oErro.message + '; пожалуйста, попробуйте еще раз '

Пока все хорошо. Но если я смешиваю имя переменной с variable.qualifier, все начинает запутываться:

cExp = new RegExp('oErro(\.[^\ |^\;|^\,|^\)|^\}]*)', 'g');
cMsg = "Error ocurred: oErro.message (complete message: oErro)";
cMsg.replace(cExp, '\' + oErro$1 + \'')

Я получаю этот вывод

'Произошла ошибка:' + oErro.message + '(полное сообщение:' + oErro) + ''

, пока я ожидал этого вывода (обратите внимание на круглые скобки ВНУТРИ кавычек)

'Произошла ошибка:' + oErro.message + '(полное сообщение:' + oErro + ')'

Другими словами, каждый раз, когда "oErro" используется без квалификатора , выражение получает следующее слово и соединяется с oErro вне заключающих в кавычки слов.

Конечно, я делаю что-то не так, но я не очень знаком с RegExp и, возможно, не ищу правильные термины, чтобы получить соответствующие help.

Мне нужно выражение, которое работает для обоих сценариев ios (удаление слова «oErro» или синтаксиса «oErro.something» из кавычек в последней строке) ...

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

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

I полагаю Ваше требование для захвата имени свойства или метода удовлетворяется с помощью символа \ w в вашем регулярном выражении.

С oErro

cMsg = "Error ocurred: oErro; please try again";
cMsg.replace(/(oErro(\.\w+)?)/g, '\' + $1 + \'');
// Output: "Error ocurred: ' + oErro + '; please try again"

С oError.message

cMsg = "Error ocurred: oErro.message (complete message: oErro)";
cMsg.replace(/(oErro(\.\w+)?)/g, '\' + $1 + \'');
// Output: "Error ocurred: ' + oErro.message + ' (complete message: ' + oErro + ')"
1 голос
/ 19 апреля 2020

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

cExp=/oErro(?:\.[^\s;,)}]+)?/g
// Or, if the chars after `.` can only only be letters/digits/underscore
cExp = /oErro(?:\.\w+)?/g

Тогда вам нужно будет использовать

cMsg.replace(cExp, '\' + $& +  \'')

, где $& - это обратная ссылка ко всему значению совпадения.

Детали шаблона

  • oErro - буквенная строка
  • (?:\.\w+)? - необязательно (из-за ? в конце) не - группа захвата , которая соответствует 1 или 0 вхождениям
    • \. - точка - \w+ - 1+ букв / цифр / подчеркиваний
    • [^\s;,)}]+ - 1 или более символы, кроме пробелов, ;, ,, ) и }.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...