如何使用 Node js 将变量传递给正则表达式?
How do I pass a variable into regex with Node js?
基本上,我有一个正则表达式
var regex1 = /10661\" class=\"fauxBlockLink-linkRow u-concealed\">([\s\S]*?)<\/a>/;
var result=text.match(regex1);
user_activity = result[1].replace(/\s/g, "")
console.log(user_activity);
我想做的是这个
var number = 1234;
var regex1 = /${number}\" class=\"fauxBlockLink-linkRow u-concealed\">([\s\S]*?)<\/a>/;
但它不起作用,当我尝试使用 RegExp 时,我不断收到错误。
您可以使用 RegExp
从字符串创建正则表达式并在该字符串中使用变量。
var number = 1234;
var regex1 = new RegExp(`${number}aa`);
console.log("1234aa".match(regex1));
您可以使用模板 and/or 字符串添加构建正则表达式字符串,然后将其传递给 RegExp
构造函数。这样做的一个关键是正确转义,因为您需要对反斜杠进行额外级别的转义,因为字符串的解释需要一级反斜杠,但您需要一个反斜杠才能在它到达 RegExp 构造函数时继续存在。这是一个工作示例:
function match(number, str) {
let r = new RegExp(`${number}" class="fauxBlockLink-linkRow u-concealed">([\s\S]*?)<\/a>`);
return str.match(r);
}
const exampleHTML = '<a href="something" class="aaa1234" class="fauxBlockLink-linkRow u-concealed">Some link text</a>';
console.log(match(1234, exampleHTML));
注意,像这样使用正则表达式匹配 HTML 变得很 order-sensitive(而 HTML 本身不是 order-sensitive)。而且,您的正则表达式在 class 之间只需要一个 space,而 HTML 则不需要。如果 class 名称在 <a>
标签中的顺序略有不同或间距不同,则它不会匹配。根据您真正想要做的事情,可能有更好的方法来解析和使用不是 order-sensitive.
的 HTML
我用Adem的方法解决了,
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\]/g, '\$&'); // $& means the whole matched string
}
var number = 1234;
var firstPart = `<a href="/forum/search/member?user_id=${number}" class="fauxBlockLink-linkRow u-concealed">`
var regexpString = escapeRegExp(firstPart) + '([\s\S]*?)' + escapeRegExp('</a>');
console.log(regexpString)
var sample = `<a href="/forum/search/member?user_id=1234" class="fauxBlockLink-linkRow u-concealed"> </a>`
var regex1 = new RegExp(regexpString);
console.log(sample.match(regex1));
首先问题实际上是我读取文件的方式,我正在应用匹配的数据是未定义的。
基本上,我有一个正则表达式
var regex1 = /10661\" class=\"fauxBlockLink-linkRow u-concealed\">([\s\S]*?)<\/a>/;
var result=text.match(regex1);
user_activity = result[1].replace(/\s/g, "")
console.log(user_activity);
我想做的是这个
var number = 1234;
var regex1 = /${number}\" class=\"fauxBlockLink-linkRow u-concealed\">([\s\S]*?)<\/a>/;
但它不起作用,当我尝试使用 RegExp 时,我不断收到错误。
您可以使用 RegExp
从字符串创建正则表达式并在该字符串中使用变量。
var number = 1234;
var regex1 = new RegExp(`${number}aa`);
console.log("1234aa".match(regex1));
您可以使用模板 and/or 字符串添加构建正则表达式字符串,然后将其传递给 RegExp
构造函数。这样做的一个关键是正确转义,因为您需要对反斜杠进行额外级别的转义,因为字符串的解释需要一级反斜杠,但您需要一个反斜杠才能在它到达 RegExp 构造函数时继续存在。这是一个工作示例:
function match(number, str) {
let r = new RegExp(`${number}" class="fauxBlockLink-linkRow u-concealed">([\s\S]*?)<\/a>`);
return str.match(r);
}
const exampleHTML = '<a href="something" class="aaa1234" class="fauxBlockLink-linkRow u-concealed">Some link text</a>';
console.log(match(1234, exampleHTML));
注意,像这样使用正则表达式匹配 HTML 变得很 order-sensitive(而 HTML 本身不是 order-sensitive)。而且,您的正则表达式在 class 之间只需要一个 space,而 HTML 则不需要。如果 class 名称在 <a>
标签中的顺序略有不同或间距不同,则它不会匹配。根据您真正想要做的事情,可能有更好的方法来解析和使用不是 order-sensitive.
我用Adem的方法解决了,
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\]/g, '\$&'); // $& means the whole matched string
}
var number = 1234;
var firstPart = `<a href="/forum/search/member?user_id=${number}" class="fauxBlockLink-linkRow u-concealed">`
var regexpString = escapeRegExp(firstPart) + '([\s\S]*?)' + escapeRegExp('</a>');
console.log(regexpString)
var sample = `<a href="/forum/search/member?user_id=1234" class="fauxBlockLink-linkRow u-concealed"> </a>`
var regex1 = new RegExp(regexpString);
console.log(sample.match(regex1));
首先问题实际上是我读取文件的方式,我正在应用匹配的数据是未定义的。