#javascript #dart
#javascript #dart
Вопрос:
В JavaScript у меня есть следующее:
function escape(text)
{
var tx = text.replace(/[amp;<>"']/g);
}
У меня возникли проблемы при попытке сделать то же самое на Dart:
var reg = new RegExp("/[amp;<>"']/g"); -->this throws error.
Как я могу получить эквивалентное выражение?
Ответ №1:
Источник регулярных выражений Dart не используется /
для разграничения регулярных выражений, это просто строки, передаваемые RegExp
конструктору. Обычно рекомендуется использовать «необработанную строку», потому что обратная косая черта означает что-то в регулярных выражениях, а также в необработанных строковых литералах, и регулярное выражение JavaScript /rn/
будет RegExp("\r\n")
в Dart без необработанных строк, но RegExp(r"rn")
с необработанной строкой, гораздо более читаемым. В данном конкретном случае, когда строка содержит оба '
и "
, это становится сложнее, но вместо этого вы можете использовать «многострочную строку» — в качестве разделителей используются символы тройных кавычек, поэтому они могут содержать символы одинарных кавычек без экранирования (на самом деле это не обязательно должно занимать несколько строк).
У Dart нет чего-то похожего на g
флаг регулярных выражений JavaScript. Регулярные выражения Dart не имеют состояния, именно функции, использующие их, должны заботиться о том, чтобы запомнить, где они совпадают, а не само регулярное выражение. Итак, нет необходимости в g
.
Итак:
RegExp(r"""[amp;<>"']""");
// or
RegExp(r'''[amp;<>"']''');
Это становится немного переполненным всеми этими кавычками, и вы можете вместо этого использовать необработанную строку, чтобы вы могли экранировать кавычку, которая соответствует строке (что проще, потому что ваше регулярное выражение само по себе не содержит обратной косой черты):
RegExp("[amp;<>"']");
// or
RegExp('[amp;<>"']');
Если вы делаете это, когда ваше регулярное выражение использует обратную косую черту регулярного выражения, вам нужно будет удвоить обратную косую черту, что легко забыть, поэтому рекомендуется использовать необработанные строки.
Комментарии:
1. Спасибо за полный ответ, я обязательно попробую.
Ответ №2:
Вы забыли экранировать двойные кавычки
new RegExp("/[amp;<>"']", 'g');