因此,我有一个数学算法的创建者,用户可以从可能的变量列表中插入变量,并且他们可以仅使用那些变量以及数学中使用的数字和字符(如括号等)来创建算法。 我需要一个正则表达式,该表达式将从字符串中删除不是这些变量或()。*-+ /或数字之一的任何内容。 我尝试了很多正则表达式,但没有一个能满足我的需要 所有变量都必须用大括号括起来。
例如
/^(?!{profitPercent}|{productPrice}|{weight}|{quantityInCart}|{lineTotal}|{cartTotal}|{billingUnits}|{test_111}|{test_213}|{test_prod_input_15}|{test_prod_input_16}).*/g
这只会删除所有内容,并且数字和()也不例外。*-+ /
说我有以下字符串:
var str='this is a string with a {productPrice} variable and some 827/100 math in it';
除了
,我需要删除所有内容{productPrice}827/100
这是我的代码:
var reg=new RegExp("^(?!{" + escapeString(variableNames.join("}|{")) + "}).*","g");
txt=txt.replace(reg,'');
我尝试了许多不同的表达式,但没有一个起作用。
答案 0 :(得分:3)
我将使用match选择所需的值
{[^}]+}|[\d)(.*+/]+
{[^}]+}
-匹配{
,后跟任何}
。|
-交替出现。[[\d)(.*+/]+]
-匹配digit, operators, (, )
let str = `var str='this is a string with a {productPrice} variable and some 827/100 math in it`
let op = str.match(/{[^}]+}|[\d)(.*+/]+/g)
console.log(op.join(''))
答案 1 :(得分:0)
如果您先将字符串分割开,则可能会更容易
const whitelist = new Set([
'{profitPercent}',
'{productPrice}',
'{weight}',
'{quantityInCart}',
'{lineTotal}',
'{cartTotal}',
'{billingUnits}',
'{test_111}',
'{test_213}',
'{test_prod_input_15}',
'{test_prod_input_16}',
])
const regex = /[0-9.*\-+\/]/;
const str = 'this is a string with a {productPrice} variable and some 827/100 math in it'
const newStr = str.split(' ').filter((word) => {
return whitelist.has(word) || regex.test(word)
}).join('')
console.log(newStr)
如果您没有变量白名单,只需要匹配花括号内的任何内容,我会选择另一个答案
答案 2 :(得分:0)
可以这样做。
/.*?(?:((?:{profitPercent}|{productPrice}|{weight}|{quantityInCart}|{lineTotal}|{cartTotal}|{billingUnits}|{test_111}|{test_213}|{test_prod_input_15}|{test_prod_input_16}|[-().*+\d\/])+)|$)/g
https://regex101.com/r/lHx4FE/1
而不是删除您不想要想要的内容,而是删除您不想要想要的内容。
积极的诠释总是更好。
用$1
替换所需的内容。
扩展
.*?
(?:
( # (1 start)
(?:
{profitPercent}
| {productPrice}
| {weight}
| {quantityInCart}
| {lineTotal}
| {cartTotal}
| {billingUnits}
| {test_111}
| {test_213}
| {test_prod_input_15}
| {test_prod_input_16}
| [-().*+\d/]
)+
) # (1 end)
|
$
)
答案 3 :(得分:0)
代替声明字符串^
的开头并使用negative lookahead (?!
中的变量,您可以在非捕获组(?:
中使用它们
然后将要匹配的变量添加到字符类[().*+/\d]+
并将其添加到alternation。
这将为您提供要保留的匹配项,并且您可以使用join(使用空字符串作为分隔符来连接它们),结果是:
{productPrice}827/100
您的代码(您必须添加escapeString
)如下所示:
var variableNames = [
"profitPercent",
"productPrice",
"weight",
"quantityInCart",
"lineTotal",
"cartTotal",
"billingUnits",
"test_111",
"test_213",
"test_prod_input_15",
"test_prod_input_16"
];
var str = 'this is a string with a {productPrice} variable and some 827/100 math in it';
var reg = new RegExp("(?:{" + variableNames.join("}|{") + "}|[\\d)(.*+/]+)", "g");
str = str.match(reg).join('');
console.log(str);