正则表达式删除所有非数字或特定单词的内容

时间:2019-01-24 18:41:02

标签: javascript regex

因此,我有一个数学算法的创建者,用户可以从可能的变量列表中插入变量,并且他们可以仅使用那些变量以及数学中使用的数字和字符(如括号等)来创建算法。 我需要一个正则表达式,该表达式将从字符串中删除不是这些变量或()。*-+ /或数字之一的任何内容。 我尝试了很多正则表达式,但没有一个能满足我的需要 所有变量都必须用大括号括起来。

例如

/^(?!{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,'');

我尝试了许多不同的表达式,但没有一个起作用。

4 个答案:

答案 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);