Можно ли сделать что-то подобное?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Или я должен использовать новый RegExp()
синтаксис и объединить строку? Я бы предпочел использовать литерал, так как код более очевиден и лаконичен.
javascript
regex
syntax
eyelidlessness
источник
источник
let regexSegment1 = String.raw`\s*hello\s*`
Ответы:
Вот как создать регулярное выражение без использования литерального синтаксиса регулярного выражения. Это позволяет вам выполнять произвольные манипуляции со строками до того, как они станут объектом регулярного выражения:
Если у вас есть два литерала регулярных выражений, вы можете объединить их, используя эту технику:
Это просто более многословно, чем просто иметь выражение 1 и 2, являющиеся литеральными строками вместо литеральных регулярных выражений.
источник
new RegExp(/(/.source + /.*/.source + /)?/.source);
Кажется, что создание выражения не работает.expression_one
? Вы имеете в видуregex1
?Простая случайная конкатенация объектов регулярных выражений может иметь некоторые побочные эффекты. Вместо этого используйте RegExp.source :
Это также даст вам возможность сохранить флаги регулярного выражения из предыдущего RegExp, используя стандартные флаги RegExp.
jsFiddle
источник
RegExp.prototype.flags
Я не совсем согласен с опцией "eval".
выдаст "// abcd // efgh //", что не является ожидаемым результатом.
Используя источник как
даст "/ abcdefgh /", и это правильно.
Логично, что нет необходимости оценивать, вы знаете свое выражение. Вам просто нужен ИСТОЧНИК или как он написан, не обязательно его значение. Что касается флагов, вам просто нужно использовать необязательный аргумент RegExp.
В моей ситуации я сталкиваюсь с проблемой использования ^ и $ в нескольких выражениях, которые я пытаюсь объединить вместе! Эти выражения представляют собой грамматические фильтры, используемые в программе. Теперь я не хочу использовать некоторые из них вместе, чтобы справиться с ситуацией ПРЕДЛОЖЕНИЙ. Возможно, мне придется «нарезать» источники, чтобы удалить начальный и конечный ^ (и / или) $ :) Приветствия, Алекс.
источник
var regex = "\.\..*"
Проблема Если регулярное выражение содержит группы с обратным соответствием, такие как \ 1.
Тогда просто контактирование с источниками не будет работать. В самом деле, сочетание этих двух:
Решение: сначала мы подсчитываем количество совпадающих групп в первом регулярном выражении, затем для каждого обратно совпадающего токена во втором мы увеличиваем его на количество совпадающих групп.
Тест:
источник
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Было бы предпочтительно использовать буквальный синтаксис как можно чаще. Это короче, более разборчиво, и вам не нужны escape-кавычки или двойные обратные зазоры. Из "Javascript Patterns", Стоян Стефанов 2010.
Но использование New может быть единственным способом объединения.
Я бы избежал Eval. Это небезопасно.
источник
При условии что:
/this/g
а неnew RegExp('this', 'g')
;Тогда вы можете написать так:
тогда вы можете сделать что-то вроде:
В моем конкретном случае (редактор с зеркальным отображением кода) гораздо проще выполнить одно большое регулярное выражение, чем много замен, например, следующих, поскольку каждый раз, когда я заменяю тег html для переноса выражения, следующий шаблон будет быть более трудным для цели, не затрагивая сам тег html (и без хорошего внешнего вида, который, к сожалению, не поддерживается в javascript):
источник
Вы могли бы сделать что-то вроде:
Сегменты будут строками (а не литералами регулярных выражений), передаваемыми как отдельные аргументы.
источник
Нет, буквальный путь не поддерживается. Вам придется использовать RegExp.
источник
Используйте конструктор с 2 параметрами и избегайте проблемы с завершающим символом '/':
источник
Вы можете объединить источник регулярных выражений как из литерала, так и из класса RegExp:
источник
мне проще было бы объединить источники, напр .:
значение c приведет к:
источник
Я предпочитаю использовать,
eval('your expression')
потому что он не добавляет/
на каждом конце,/
что='new RegExp'
делает.источник