jQuery validate: использование переменной в регулярном выражении [duplicate]

Вполне возможно, что люди, которые подписываются на вашу службу, вводят электронные письма с ошибками ввода, которые вы не исправляете. Например: chris@gmial.com -or- james@hotnail.com.

И такие домены сконфигурированы для использования в качестве spamtraps , которые автоматически помещают IP-адрес вашего почтового сервера и / или домен и повредить его репутации.

Чтобы избежать этого, выполните двойную проверку для адреса электронной почты, который вводится при подписке на продукт. Также отправьте электронное письмо с подтверждением, чтобы убедиться, что этот адрес электронной почты проверен на 100% человеком, который вводит письмо с подтверждением, прежде чем отправлять им ключ продукта или принять их подписку. Письмо с подтверждением должно требовать, чтобы получатель щелкнул ссылку или ответ, чтобы действительно подтвердить, что владельцем почтового ящика является человек, который зарегистрировался.

1026
задан JC Grubbs 5 December 2016 в 04:05
поделиться

18 ответов

Вместо синтаксиса /regex/g вы можете создать новый объект RegExp :

var replace = "regex";
var re = new RegExp(replace,"g");

Таким образом вы можете динамически создавать объекты регулярных выражений. Затем вы выполните:

"mystring".replace(re, "newstring");
1390
ответ дан jcubic 15 August 2018 в 17:25
поделиться
  • 1
    Если вам нужно использовать выражение типа /\/word\:\w*$/, обязательно избегайте обратных косых черт: new RegExp( '\\/word\\:\\w*$' ). – Jonathan Swinney 10 November 2010 в 00:04
  • 2
    – Eric Wendelin 21 June 2011 в 16:19
  • 3
    Полное объяснение побега: stackoverflow.com/a/6969486/151312 – CoolAJ86 3 June 2012 в 02:33
  • 4
    Вопрос предполагает, что RegEx используется только для постоянной замены строк. Таким образом, это ответ неправильный, поскольку он потерпит неудачу, если строка содержит метасимволы RegEx. Грустно это проголосовали за это высоко, сделают много головных болей ... – dronus 12 February 2014 в 22:32
  • 5
    Пример этой передачи переменной сделает это хорошим ответом. Я все еще боюсь после прочтения этого. – Goose 5 June 2015 в 18:44
  • 6
    @JonathanSwinney: / не имеет особого значения, если вы создаете регулярное выражение из строки, поэтому вам не нужно его избегать. /\/word\:\w*$/ должен быть new RegExp('/word\\:\\w*$') – Dávid Horváth 11 January 2017 в 14:52

Чтобы удовлетворить мою потребность вставить переменную / псевдоним / функцию в регулярное выражение, это то, что я придумал:

oldre = /xx\(""\)/;
function newre(e){
    return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

, где «oldre» - это исходное регулярное выражение, которое я хочу вставить переменную, «xx» - это заполнитель для этой переменной / псевдонима / функции, а «yy» - это имя, псевдоним или функция переменной.

3
ответ дан Alex Li 15 August 2018 в 17:25
поделиться

Хотя вы можете создать динамически созданный RegExp (как и другие ответы на этот вопрос), я отправлю комментарий из аналогичного сообщения : Функциональная форма String.replace () чрезвычайно полезна и во многих случаях уменьшает потребность в динамически создаваемых объектах RegExp. (которые являются своего рода болью, потому что вы должны выразить ввод конструктора RegExp как строку, а не использовать листы слэша / [A-Z] + / regexp)

3
ответ дан Community 15 August 2018 в 17:25
поделиться

Вы можете использовать это, если $ 1 не работает с вами

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
1
ответ дан Fareed Alnamrouti 15 August 2018 в 17:25
поделиться

Если вы хотите получить ВСЕ вхождения (g), нечувствительны к регистру (i) и используйте границы, чтобы это не было слово в другом слове (\\b):

re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

Пример:

let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.
4
ответ дан JBallin 15 August 2018 в 17:25
поделиться

Это:

var txt=new RegExp(pattern,attributes);

эквивалентно этому:

var txt=/pattern/attributes;

См. http://www.w3schools.com/jsref/jsref_obj_regexp.asp .

21
ответ дан Jeremy Ruten 15 August 2018 в 17:25
поделиться

И вариант ответа Стивена Пенни из coffeescript, так как это результат # 2 google ... даже если кофе - это просто javascript с большим количеством удаленных символов ...;)

baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food

и в моем конкретном случае

robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
  console.log "True!"
3
ответ дан keen 15 August 2018 в 17:25
поделиться
  • 1
    почему нисходящий? coffeescript -IS- javascript с его собственным специфическим синтаксисом. – keen 26 August 2015 в 15:53

"ABABAB".replace(/B/g, "A");

Как всегда: не используйте regex, если вам не нужно. Для простой замены строки идиома:

'ABABAB'.split('B').join('A')

Тогда вам не нужно беспокоиться о проблемах с цитированием, упомянутых в ответе Граценота.

84
ответ дан Liam 15 August 2018 в 17:25
поделиться
  • 1
    Прохладная идея, не подумал бы об этом! – devios1 31 May 2012 в 20:01
  • 2
    И вы измерили, что это быстрее, чем регулярное выражение? – Mitar 10 April 2013 в 04:12
  • 3
    Это кажется предпочтительным, особенно когда нужно сопоставлять специальные символы регулярных выражений, такие как «.». – Krease 24 April 2013 в 19:41
  • 4
    Uhm ... Не разделить также RegExp; если это так, не вызовет ли такая же проблема? В любом случае ... .split (). Join () может быть медленнее на некоторых платформах, потому что это две операции, тогда как .replace () - одна операция и может быть оптимизирована. – user 12 June 2013 в 23:47
  • 5
    @ PacMan--: split и replace могут принимать либо строку, либо объект RegExp. Проблема, что replace имеет split, заключается не в том, что когда вы используете строку, вы получаете только одну замену. – bobince 13 June 2013 в 10:05
String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

Проверьте это как:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
3
ответ дан MetalGodwin 15 August 2018 в 17:25
поделиться
this.replace( new RegExp( replaceThis, 'g' ), withThis );
14
ответ дан Mike Samuel 15 August 2018 в 17:25
поделиться

Ваше решение находится здесь:

Передача переменной в регулярное выражение.

Тот, который я реализовал, - это значение из текста поле, которое вы хотите заменить, а другое - это «заменить на» текстовое поле, получить значение из текстового поля в переменной и установить переменную в функцию RegExp для дальнейшей замены. В моем случае я использую JQuery, вы также можете сделать это только с помощью JavaScript.

Код JavaScript:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
  var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.

  var sRegExInput = new RegExp(replace, "g");    
  $("body").children().each(function() {
    $(this).html($(this).html().replace(sRegExInput,replace_with));
  });

Этот код включен в событие Onclick кнопки, вы можете поместите это в функцию для вызова.

Итак, теперь вы можете передать переменную в функции replace.

1
ответ дан psychsane 15 August 2018 в 17:25
поделиться
  • 1
    Ваша переменная replace_with будет содержать элемент DOM, а не само значение – Ben Taliadoros 27 October 2017 в 14:26

Как упоминал Эрик Венделин, вы можете сделать что-то вроде этого:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

Это дает "regex matching .". Однако он будет терпеть неудачу, если str1 - ".". Вы ожидаете, что результат будет "pattern matching regex", заменив период на "regex", но он окажется ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Это потому, что, хотя "." a String, в конструкторе RegExp он по-прежнему интерпретируется как регулярное выражение, что означает любой символ нестрочного разрыва, означающий каждый символ в строке. Для этой цели может быть полезной следующая функция:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

. Тогда вы можете сделать:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

, уступая "pattern matching regex".

168
ответ дан Qtax 15 August 2018 в 17:25
поделиться
  • 1
    Вы знаете, что первый заменяемый параметр может быть нормальной строкой и не должен быть регулярным выражением? str1 = "."; («сопоставление шаблонов» .replace (str1, «строка»)); – some 30 January 2009 в 11:31
  • 2
    @ some: конечно. Это потому, что приведенный выше пример тривиален. Когда вам нужно искать или заменять шаблон в сочетании с обычной строкой, выполните str.match (например, новый regExp («https?: //» и «RegExp.escape (myDomainName)). Это раздражает, что побег функция не встроена. – Gracenotes 30 January 2009 в 20:57
  • 3
    (продолжение) Плюс, очевидно, что JC Grubbs потребовал глобальной замены; реализация глобальной замены на String.replace (String, String) может быть медленной для большого ввода. Я просто говорю, что два лучших решения ошибочны, и на некоторых входах не будет неожиданно неожиданно. – Gracenotes 30 January 2009 в 21:00
  • 4
    developer.mozilla.org/en-US/docs/JavaScript/Guide/… предлагает аналогичную функцию, но они исключают - и включают =!:/. – chbrown 15 December 2012 в 23:12
  • 5
    Правильным термином является «escape», а не «цитата». Просто BTW. – Lawrence Dol 4 December 2015 в 06:19

Вы всегда можете использовать indexOf несколько раз:

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

Это не переходит в бесконечный цикл, когда замена содержит совпадение.

1
ответ дан Ry- 15 August 2018 в 17:25
поделиться

Вы хотите динамически строить регулярное выражение, и для этого правильным решением является использование конструктора new RegExp(string). Чтобы конструктор обрабатывал специальные символы буквально , вы должны избегать их. Существует встроенная функция в виджета автозаполнения jQuery UI , называемая $.ui.autocomplete.escapeRegex:

[...] вы можете использовать встроенный $.ui.autocomplete.escapeRegex. Он возьмет один строковый аргумент и уберет все символы регулярных выражений, что сделает результат безопасным для перехода к new RegExp().

Если вы используете jQuery UI, вы можете использовать эту функцию или скопировать его определение из источника :

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

И использовать его следующим образом:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"
7
ответ дан Salman A 15 August 2018 в 17:25
поделиться

Вот еще одна реализация replaceAll:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };
3
ответ дан scripto 15 August 2018 в 17:25
поделиться

Для тех, кто хочет использовать переменную с методом совпадения, это сработало для меня

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
27
ответ дан Steven Penny 15 August 2018 в 17:25
поделиться
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Проверьте этот инструмент

9
ответ дан unigogo 15 August 2018 в 17:25
поделиться
1
ответ дан Paul Jones 29 October 2018 в 00:27
поделиться
Другие вопросы по тегам:

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