Regex, чтобы удалить все, что не числовые или конкретные слова - PullRequest
0 голосов
/ 24 января 2019

Итак, у меня есть создатель математического алгоритма, в который пользователь вставляет переменные из списка возможных переменных, и он может создать алгоритм с использованием только тех переменных, а также чисел и символов, используемых в математике, таких как скобки и другие. Мне нужно регулярное выражение, которое удалит из строки все, что не является ни одной из этих переменных или (). * - + / или число. Я перепробовал много регулярных выражений, но ни один не сделал то, что мне нужно все переменные должны быть заключены в фигурные скобки.

Например

/^(?!{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 голосов
/ 24 января 2019

Вместо подтверждения начала строки ^ и использования переменных в отрицательном прогнозе (?! вы можете использовать их в группе без захвата (?:

Затем добавьте переменные, которые вы хотите сопоставить, к классу символов [().*+/\d]+ и добавьте это к чередованию .

Это даст вам совпадения, которые вы хотите сохранить, и вы можете использовать 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);
0 голосов
/ 24 января 2019

Может быть проще, если сначала разбить строку, т.е.

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)

Я бы выбрал другой ответ, если у вас нет белого списка переменных и вам просто нужно сопоставить что-либо внутри фигурных скобок

0 голосов
/ 24 января 2019

Можно сделать так.

/.*?(?:((?:{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

Вместо удаления того, что вы НЕ хотите, удалите все, кроме того, что вы DO хотите.
Позитивная интерпретация всегда лучше.

Замените на $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)
   |  
      $ 
 )
0 голосов
/ 24 января 2019

Я сделаю это, выбрав нужное значение с помощью совпадения

{[^}]+}|[\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(''))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...