set regex с входными переменными [duplicate]

Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.

Вот пример того же:

var async = require("async");

// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
    // some asynchronous operation
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;
            _callback();
        }
    });
});

async.parallel(asyncTasks, function(){
    // result is available after performing asynchronous operation
    console.log(result)
    console.log('Done');
});

Я использую объект result для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.

Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.

251
задан nhahtdh 16 July 2015 в 03:44
поделиться

9 ответов

Используйте конструктор объекта RegExp для создания регулярного выражения из строки:

var re = new RegExp("a|b", "i");
// same as
var re = /a|b/i;
483
ответ дан Gumbo 24 August 2018 в 18:27
поделиться

Вы можете запросить флаги с помощью флажков, а затем сделать что-то вроде этого:

var userInput = formInput;
var flags = '';
if(formGlobalCheckboxChecked) flags += 'g';
if(formCaseICheckboxChecked) flags += 'i';
var reg = new RegExp(userInput, flags);
0
ответ дан Akshat Mahajan 24 August 2018 в 18:27
поделиться

Используйте конструктор объектов JavaScript RegExp .

var re = new RegExp("\\w+");
re.test("hello");

Вы можете передавать флаги в качестве второго строкового аргумента конструктору. Подробнее см. В документации.

11
ответ дан Ayman Hourieh 24 August 2018 в 18:27
поделиться

Благодаря более ранним ответам этот блок служит также универсальным решением для применения настраиваемой строки в RegEx .. для фильтрации текста:

var permittedChars = '^a-z0-9 _,.?!@+<>';
permittedChars = '[' + permittedChars + ']';

var flags = 'gi';
var strFilterRegEx = new RegExp(permittedChars, flags);

log.debug ('strFilterRegEx: ' + strFilterRegEx);

strVal = strVal.replace(strFilterRegEx, '');
// this replaces hard code solt:
// strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '');
1
ответ дан gnB 24 August 2018 в 18:27
поделиться

Это будет работать также, если строка недействительна или не содержит флагов и т. д.:

function regExpFromString(q) {
  let flags = q.replace(/.*\/([gimuy]*)$/, '$1');
  if (flags === q) flags = '';
  let pattern = (flags ? q.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1') : q);
  try { return new RegExp(pattern, flags); } catch (e) { return null; }
}

console.log(regExpFromString('\\bword\\b'));
console.log(regExpFromString('\/\\bword\\b\/gi'));
            

2
ответ дан kofifus 24 August 2018 в 18:27
поделиться
var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1');
var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
var regex = new RegExp(pattern, flags);

или

var match = inputstring.match(new RegExp('^/(.*?)/([gimy]*)$'));
// sanity check here
var regex = new RegExp(match[1], match[2]);
57
ответ дан Maksym 24 August 2018 в 18:27
поделиться

Вот однострочный: str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')

Я получил его из модуля escape-string-regexp NPM.

Попробуйте :

escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
function escapeStringRegExp(str) {
    return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&');
}

console.log(new RegExp(escapeStringRegExp('example.com')));
// => /example\.com/
10
ответ дан Rivenfall 24 August 2018 в 18:27
поделиться

В моем случае пользовательский ввод иногда окружен разделителями, а иногда и нет. поэтому я добавил другой случай ..

var regParts = inputstring.match(/^\/(.*?)\/([gim]*)$/);
if (regParts) {
    // the parsed pattern had delimiters and modifiers. handle them. 
    var regexp = new RegExp(regParts[1], regParts[2]);
} else {
    // we got pattern string without delimiters
    var regexp = new RegExp(inputstring);
}
8
ответ дан staabm 24 August 2018 в 18:27
поделиться

Предлагаю также добавить отдельные флажки или текстовое поле для специальных флагов. Таким образом, понятно, что пользователю не нужно добавлять никаких //. В случае замены укажите два текстовых поля. Это сделает вашу жизнь намного легче.

Почему? Потому что в противном случае некоторые пользователи добавят //, а другие - нет. И некоторые будут делать синтаксическую ошибку. Затем, после того, как вы разделили //, вы можете получить синтаксически действующее регулярное выражение, которое не похоже на то, что предназначалось пользователю, что приводит к странному поведению (с точки зрения пользователя).

2
ответ дан Steven Penny 24 August 2018 в 18:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: