提问人:Jason Is My Name 提问时间:3/23/2020 最后编辑:halferJason Is My Name 更新时间:3/24/2020 访问量:35
如何在 jQuery 的 .match() 中使用正则表达式
How to use a regular expression within jQuery's .match()
问:
我一直在尝试让几个类似的正则表达式在使用 .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) {
我不明白为什么会这样。
答: 暂无答案
评论
RegExp
/abc/g
'/abc/g'
').*?(?=\+)'
一定是,看 stackoverflow.com/questions/17863066/...').*?(?=\\+)'
/
是正则表达式文本中使用的正则表达式分隔符。您正在使用 RegExp 构造函数,因此,请替换为'/(?<='
'(?<='