当前位置:  开发笔记 > 编程语言 > 正文

如何在正则表达式中使用变量?

如何解决《如何在正则表达式中使用变量?》经验,为你挑选了10个好方法。

我想在JavaScript中创建一个String.replaceAll()方法,我认为使用RegEx将是最简洁的方法.但是,我无法弄清楚如何将变量传递给RegEx.我已经可以做到这一点,它将用"A"替换所有"B"的实例.

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

但我想做这样的事情:

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

但显然这只会替换文本"replaceThis"...所以如何将此变量传递给我的RegEx字符串?



1> Eric Wendeli..:

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

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

您可以通过这种方式动态创建正则表达式对象.然后你会做:

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


如果你需要使用像`/\/ word \:\ w*$ /`这样的表达式,请务必使用反斜杠:`new RegExp('\\/word \\:\\ w*$')`.
问题表明RegEx仅用于进行常量字符串替换.所以这是答案是错误的,因为如果字符串包含RegEx元字符,它将失败.可悲的是,它投得如此之高,会让人头疼......
传递变量的一个例子就是一个很好的答案.读完之后我还在苦苦挣扎.
@JonathanSwinney:`/`如果你从string构造正则表达式没有特殊意义,所以你不需要转义它.`/\/ word \:\ w*$ /`应该是`new RegExp('/ word \\:\\ w*$')`
@gravityboy你可以做(​​''+ myNumber).replace(/ 10/g,'a')或者你想要十六进制数字,你可以做parseInt(''+ myNumber,16)从十进制转换为十六进制.

2> Gracenotes..:

正如Eric Wendelin所说,你可以这样做:

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

这产生了"regex matching .".但是,如果str1是,它将失败".".你期望得到的结果"pattern matching regex",取代期间"regex",但结果是......

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

这是因为,尽管"."是一个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".


正确的术语是"逃避",而不是"引用".只是BTW.
您知道要替换的第一个参数可以是普通字符串而不必是正则表达式吗?str1 ="."; alert("模式匹配.".replace(str1,"string"));
https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions提供了类似的功能,但它们排除了`-`,并包含`=!:/`.

3> bobince..:

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

一如既往:除非必须,否则不要使用正则表达式.对于简单的字符串替换,成语是:

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

那么你不必担心Gracenotes答案中提到的引用问题.


你有没有测量过这比正则表达更快?
@ PacMan--:`split`和`replace`都可以使用字符串或`RegExp`对象.`replace`的问题是`split`不是因为当你使用一个字符串时,你只能获得一个替换.
这似乎更可取,特别是当需要匹配特殊的正则表达式字符,如'.'

4> 小智..:

对于任何希望使用匹配方法使用变量的人来说,这对我有用

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight



5> Jeremy Ruten..:

这个:

var txt=new RegExp(pattern,attributes);

相当于:

var txt=/pattern/attributes;

请参见http://www.w3schools.com/jsref/jsref_obj_regexp.asp.


是的,但在第一个例子中,它使用`pattern`作为变量,在2nd中作为字符串

6> JBallin..:

如果你想获得ALL occurrence(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.



7> tvanfosson..:
this.replace( new RegExp( replaceThis, 'g' ), withThis );



8> Salman A..:

您想要动态构建正则表达式,为此,正确的解决方案是使用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]"



9> unigogo..:
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

使用此工具进行测试



10> MetalGodwin..:
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("]", ">"))

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有