Я разрабатываю тестер регулярных выражений в HTML и JavaScript. Пользователь вводит регулярное выражение, строку и выбирает функцию, которую он хочет проверить (например, поиск, сопоставление, замена и т. Д.), С помощью переключателя, и программа отображает результаты, когда эта функция запускается с указанными аргументами. Естественно, будут дополнительные текстовые поля для дополнительных аргументов для замены и тому подобное.
Моя проблема заключается в получении строки от пользователя и превращении ее в регулярное выражение. Если я скажу, что им не нужно иметь //
символы, которые они вводят в регулярном выражении, тогда они не могут устанавливать флаги, как g
и i
. Таким образом, они должны иметь //
символы вокруг выражения, но как я могу преобразовать эту строку в регулярное выражение? Он не может быть литералом, поскольку он является строкой, и я не могу передать его конструктору RegExp, поскольку он не является строкой без //
символа s. Есть ли другой способ сделать пользовательскую строку ввода в регулярное выражение? Придется ли мне анализировать строку и флаги регулярного выражения //
и затем конструировать их по-другому? Нужно ли им вводить строку, а затем вводить флаги отдельно?
источник
var re = new RegExp("\\w+");
<input>
HTML-теге.var re = new RegExp("\"\\w+\"");
является примером жестких кодированными с использованием регулярных выражений конструктора RegExp и избежать двойных кавычек это необходимо. Под строкой в переменной я подразумеваю, что вы можете просто делатьvar re = new RegExp(str);
иstr
содержать двойные кавычки или обратную косую черту без проблем.или
источник
/\/
распознается.Вот одна строка:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Я получил это из модуля NPM escape-string-regexp .
Опробовать это:
Использование теговых литералов шаблона с поддержкой флагов:
источник
Используйте конструктор объектов JavaScript RegExp .
Вы можете передать флаги как второй строковый аргумент в конструктор. Смотрите документацию для деталей.
источник
В моем случае пользовательский ввод иногда был разделен разделителями, а иногда нет. поэтому я добавил еще один случай ..
источник
.split()
функцию вместо длинной строки регулярного выражения.regParts = inputstring.split('/')
это сделало быregParts[1]
строку регулярного выражения иregParts[2]
разделители (при условии, что настройка регулярного выражения равна/.../gim
). Вы можете проверить, есть ли разделители сregParts[2].length < 0
.Я предлагаю вам также добавить отдельные флажки или текстовое поле для специальных флагов. Таким образом, ясно, что пользователю не нужно добавлять какие
//
- либо . В случае замены предоставьте два текстовых поля. Это сделает вашу жизнь намного проще.Зачем? Потому что в противном случае некоторые пользователи будут добавлять
//
, а другие нет. А некоторые сделают синтаксическую ошибку. Затем, после того, как вы удалите//
их, вы можете получить синтаксически правильное регулярное выражение, которое не похоже на то, что задумал пользователь, что ведет к странному поведению (с точки зрения пользователя).источник
Это также будет работать, когда строка недопустима или не содержит флагов и т. Д.
источник
Если вы действительно хотите преобразовать строку в регулярное выражение, попробуйте использовать следующую функцию:
Вы можете использовать это так:
Для справки, вот отформатированная и более современная версия:
источник
Благодаря более ранним ответам, эти блоки служат универсальным решением для применения настраиваемой строки в RegEx .. для фильтрации текста:
источник
Вы можете запросить флаги с помощью флажков, а затем сделать что-то вроде этого:
источник
Я использую,
eval
чтобы решить эту проблему.Например:
источник