Py学习  »  Jquery

regex使用验证器传递变量值并验证jquery[duplicate]

snowcita • 5 年前 • 2193 次点击  

我想创造一个 String.replaceAll() 方法,我认为使用正则表达式是最简洁的方法。但是,我不知道如何将变量传递给正则表达式。我已经可以这样做了,它将替换 "B" 具有 "A" .

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

但我想这样做:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

但显然这只会取代文本 "replaceThis" …那么如何将此变量传递到regex字符串中?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40161
 
2193 次点击  
文章 [ 18 ]  |  最新文章 5 年前
Paul Jones
Reply   •   1 楼
Paul Jones    6 年前

这些答案我都不清楚。我终于找到了一个很好的解释 http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/

简单的答案是:

var search_term = new RegExp(search_term, "g");    
text = text.replace(search_term, replace_term);

例如:

$("button").click(function() {
  Find_and_replace("Lorem", "Chocolate");
  Find_and_replace("ipsum", "ice-cream");
});

function Find_and_replace(search_term, replace_term) {
  text = $("textbox").html();
  var search_term = new RegExp(search_term, "g");
  text = text.replace(search_term, replace_term);
  $("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>
Saikat Sengupta Ajit Hogade
Reply   •   2 楼
Saikat Sengupta Ajit Hogade    7 年前

您的解决方案如下:

Pass a variable to regular expression.

我实现的方法是从一个文本字段获取值,这个文本字段是要替换的,另一个是“替换为”文本字段,从变量中的文本字段获取值,并将变量设置为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函数中传递变量。

Ry-
Reply   •   3 楼
Ry-    12 年前

你总是可以用 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);
};

当替换项包含匹配项时,这不会进入无限循环。

Fareed Alnamrouti
Reply   •   4 楼
Fareed Alnamrouti    12 年前

如果1块钱不合用你可以用这个

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
keen
Reply   •   5 楼
keen    9 年前

而咖啡脚本版本的史蒂文·彭尼的答案,因为这是2谷歌结果…即使咖啡只是删除了很多字符的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!"
Alex Li
Reply   •   6 楼
Alex Li    12 年前

为了满足我在正则表达式中插入变量/别名/函数的需要,我想到了以下方法:

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”是我要插入变量的原始regexp, “xx”是该变量/别名/函数的占位符, “yy”是实际的变量名、别名或函数。

Community Eternal21
Reply   •   7 楼
Community Eternal21    8 年前

虽然您可以动态创建regexp(根据对这个问题的其他回答),但我将从 similar post :的函数形式 String.replace() 是非常有用的,并且在许多情况下减少了动态创建regexp对象的需要。(这有点麻烦,因为您必须将regexp构造函数的输入表示为字符串,而不是使用斜杠/[a-z]+/regexp literal格式)

scripto
Reply   •   8 楼
scripto    12 年前

下面是另一个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;
    };
MetalGodwin
Reply   •   9 楼
MetalGodwin    12 年前
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("]", ">"))
unigogo
Reply   •   10 楼
unigogo    16 年前
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

用这个测试 tool

Salman A
Reply   •   11 楼
Salman A    6 年前

您希望动态地构建正则表达式,为此,正确的解决方案是使用 new RegExp(string) 构造器。以便构造器处理特殊字符 字面 ,你必须逃离他们。中有一个内置函数 jQuery UI autocomplete widget 打电话 $.ui.autocomplete.escapeRegex :

[…]您可以使用内置的 $.ui.autocomplete.escaperegex 功能。只需要一根绳子 参数并转义所有正则表达式字符,使结果安全到 传到 new RegExp() .

如果您使用的是jquery ui,则可以使用该函数,或复制其定义 from the source :

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]"
Mike Samuel tvanfosson
Reply   •   12 楼
Mike Samuel tvanfosson    13 年前
this.replace( new RegExp( replaceThis, 'g' ), withThis );
JBallin
Reply   •   13 楼
JBallin    7 年前

如果要获取所有事件( 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.
Jeremy Ruten
Reply   •   14 楼
Jeremy Ruten    16 年前

这是:

var txt=new RegExp(pattern,attributes);

相当于:

var txt=/pattern/attributes;

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

Steven Penny
Reply   •   15 楼
Steven Penny    10 年前

对于任何希望将变量与 比赛 方法,这对我有效

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
Liam bobince
Reply   •   16 楼
Liam bobince    7 年前

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

一如既往:除非你必须使用正则表达式,否则不要使用它。对于简单的字符串替换,习惯用法是:

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

那么你就不必担心gracenotes的答案中提到的引用问题了。

Qtax Gracenotes
Reply   •   17 楼
Qtax Gracenotes    13 年前

正如Eric Wendelin提到的,你可以这样做:

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

这个产量 "regex matching ." . 但是,如果str1是 "." . 你会希望结果是 "pattern matching regex" ,将句点替换为 "regex" ,但结果会是……

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

这是因为,尽管 “。” 是字符串,在regexp构造函数中,它仍然被解释为正则表达式,表示任何非换行字符,表示字符串中的每个字符。为此,以下功能可能有用:

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

然后你可以:

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

顺从的 “模式匹配正则表达式” .

jcubic Eric Wendelin
Reply   •   18 楼
jcubic Eric Wendelin    8 年前

而不是使用 /regex/g 语法,您可以构造一个新的 RegExp 对象:

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

您可以这样动态地创建regex对象。然后你将:

"mystring".replace(re, "newstring");