如何在 jQuery 的 .match() 中使用正则表达式

How to use a regular expression within jQuery's .match()

提问人:Jason Is My Name 提问时间:3/23/2020 最后编辑:halferJason Is My Name 更新时间:3/24/2020 访问量:35

问:

我一直在尝试让几个类似的正则表达式在使用 .match() 函数的 jQuery 脚本中工作。

我使用的旧版本的正则表达式可以工作,但由于“升级”到更具限制性,我现在无法让它成功运行:

我正在使用这个正则表达式:

var termString = queryString.match('/(?<=' + queryTermIdentifier + ').*?(?=\+)+/g'); 

但它正在产生以下错误:

Uncaught SyntaxError: Invalid regular expression: //(?<=term=).*?(?=+)+/g/: Nothing to repeat
    at String.match (<anonymous>)
    at ready-functions.js?200323021240:1361
    at ready-functions.js?200323021240:1575
    at ready-functions.js?200323021240:1624

其中第 1361 行是使用正则表达式的位置。第 1575 行是使用它的函数的末尾。1624 上的最后一个事件是文档和自动执行的 jQuery 函数的结束。

我正在使用其中的几个,它们都非常相似:

var termString = queryString.match('/(?<=' + queryTermIdentifier + ').*?(?=\+)+/g');
var categoryString = queryString.match('/(?<=' + queryCategoryIdentifier + ').*?(?=\+)+/g');
var tagString = queryString.match('/(?<=' + queryTagIdentifier + ').*?(?=$)+/g');

它们都是字符串的回溯“?<=”的变体,直到前两个字符串的“+”实例或最后一个行的末尾。

当控制台输出两个“/”时,我尝试将其删除,并将其减少到一个“/”。我也尝试过逃避它,这也有效。

不确定如何继续,因为这在我用来编写它的 RegExr 工具中工作:regexr.com/50trq

编辑(第二次尝试)

var queryString = window.location.search;

var queryTermString = '';
var queryCategoryString = '';
var queryTagString = '';

var queryTermIdentifier = 'term=';
var queryCategoryIdentifier = 'category=';
var queryTagIdentifier = 'tag=';

if (queryString.indexOf(queryTermIdentifier)) {
    console.log(queryTermIdentifier + 'was found');
    var myReg = new RegExp('(?<=' + queryTermIdentifier + ').*?(?=\+)', 'g');
    var termStringArray = myReg.exec(queryString);
    if (termStringArray.length) {
        queryTermString = termStringArray.index;
    }
}

我正在尝试这种方法,但是我仍然收到相同的错误。

编辑 2

(将“term”换成“phrase”,在“+”中添加额外的“\”,所以“\+”是)。

我已经删除了“术语”一词,因为我认为这是为某种 WordPress 功能保留的,因此将其替换为“短语”。

我还根据要求在“+”的用法中添加了一个额外的“\”。

以下是更新后的相关片段:

var queryString = window.location.search;
console.log(queryString);
// This returns '?phrase=hello+category=world+tag=youokay'

if (queryString.length) {
    var queryTermString = '';

    var queryTermIdentifier = 'phrase=';

    if (queryString.indexOf(queryTermIdentifier) > 0) {
        console.log(queryTermIdentifier + 'was found in query string');

        var myTermReg = new RegExp('/(?<=' + queryTermIdentifier + ').*?(?=&)', 'g');
        var termStringArray = myTermReg.exec(queryString);
        console.log(termStringArray);
        // THIS IS ALWAYS NULL???
        if (termStringArray.length > 0) {
            queryTermString = termStringArray.index;
        }
    }
}

这似乎允许代码执行一两行额外的行。但是,现在控制台返回

Uncaught TypeError: Cannot read property 'length' of null

引用该行:

if (termStringArray.length) {

我不明白为什么会这样。

jQuery 正则表达式 匹配

评论

1赞 Wiktor Stribiżew 3/23/2020
您必须使用构造函数通过变量动态构建正则表达式。RegExp
0赞 Jason Is My Name 3/23/2020
如果我删除变量的使用并在 match() 中使用静态值,则返回相同的错误。请您提供进一步的指导吗?
1赞 Wiktor Stribiżew 3/23/2020
是的,看到另一个骗子:stackoverflow.com/questions/7427731/......。正则表达式必须是 ,而不是/abc/g'/abc/g'
1赞 Wiktor Stribiżew 3/23/2020
').*?(?=\+)'一定是,看 stackoverflow.com/questions/17863066/...').*?(?=\\+)'
1赞 Wiktor Stribiżew 3/23/2020
/是正则表达式文本中使用的正则表达式分隔符。您正在使用 RegExp 构造函数,因此,请替换为'/(?<=' '(?<='

答: 暂无答案