社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Jquery

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

snowcita • 5 年前 • 2101 次点击  

我想创造一个 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
 
2101 次点击  
文章 [ 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    6 年前

您的解决方案如下:

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-    11 年前

你总是可以用 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    11 年前
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    5 年前

您希望动态地构建正则表达式,为此,正确的解决方案是使用 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");