为什么这个正则表达式不起作用,哪个符号更符合标准

Why doesn't this RegExp work and which notation is more standards compliant?

本文关键字:符号 标准 正则表达式 不起作用 为什么      更新时间:2023-09-26

免责声明:我意识到问"为什么我的正则表达式不起作用"是非常业余的。

我已经查看了文档,尽管我只是在挣扎。 我有一个 url(作为字符串(,我想要的是替换占位符(即 {objectID}{queryTerm}

一段时间以来,我一直在做这样的尝试:

var _serviceURL = "http://my-server.com/rest-services/someObject/{objectID}/entries?term={queryTerm}";
var re1 = new RegExp("/{([A-Za-z])+}","gi");  
var re2 = new RegExp("/{([A-Za-z]+)}+","gi");  
var re3 = new RegExp("/{([A-Za-z])+}","gi");  
var re4 = new RegExp("/({[A-Za-z]+})+","gi");  
var re5 = new RegExp("({[A-Za-z]+})+","gi");  
var re6 = new RegExp("({[A-Za-z]}+)*","g");  
var re6a = new RegExp("({([a-z]+)})+","gi");  
var re7 = /{([^}]+)}/g;
var tokens =  re6A.exec(_serviceURL);
if (null != tokens.length ){
    for(i = 0; i < tokens.length; i++){
        var t = tokens[i];
        console.log("tokens[i]: " + t);
    }            
}
else {
    console.log("RegEx fail...")
}

上面的re6a在执行时生成如下数组:

tokens: Array[3]
    0: "{objectID}"
    1: "{objectID}"
    2: "objectID"

与上述场景相关:

  1. 为什么我从来没有得到queryTerm
  2. 正则表达式"i"(忽略大小写(标志是否意味着我可以列出像 [a-z] 这样的字符类并捕获 [A-Z]?
  3. 哪种构造正则表达式对象的方法更好? ...new RegExp(...);var regExp = /{([^}]+)}/g; . 就"更好的东西"而言,我的意思是跨浏览器兼容性,并且类似于其他正则表达式实现(如果我正在学习正则表达式,我想从中获得最大的价值(。

正则表达式i(忽略大小写(标志是否意味着我可以列出像[a-z]这样的字符类并捕获[A-Z]

是的,它会捕获它们。

哪种构造正则表达式对象的方法更好? new RegExp(...)还是var regExp = /{([^}]+)}/g;?就"更好的东西"而言,我的意思是跨浏览器兼容性,并且类似于其他正则表达式实现(如果我正在学习正则表达式,我想从中获得最大的价值(。

您绝对应该使用文字表示法。
它在运行时编译一次,而不是每次使用它时。
它们都同样跨浏览器兼容。


综上所述,我会使用这个:

_serviceURL.match(/[^{}]+(?=})/g);

这是小提琴:http://jsfiddle.net/CAugU/


以下是上述正则表达式的解释:

[    opens the character set
 ^    negates the set. Will only match whatever is NOT in these brackets
 {}   match anything that is NOT a curly brace
]    close the character set
+    match that as many times as possible
(?=  ascertain that it is possible to match the following here (won't be included in the match, this is called a lookahead)
 }    match a curly brace
)    close the lookahead

当您要替换占位符时,使用 replace 而不是 match 似乎更自然,例如:

var _serviceURL = "http://my-server.com/rest-services/someObject/{objectID}/entries?term={queryTerm}"
var values = {
    objectID: 1234,
    queryTerm: "hello"
}
var result = _serviceURL.replace(/{(.+?)}/g, function($0, $1) {
    return values[$1]
})

产量http://my-server.com/rest-services/someObject/1234/entries?term=hello