Извлечь только часть строки с помощью регулярных выражений с JavaScript

1

Я пытаюсь извлечь часть строки и заменить ее с помощью regex в javascript. например:

var string = "application == xyz AND location == abc AND packet.vlan == 10 OR ip == 1.1.1.1" 

Мне нужно заменить

packet.vlan == 10 

с

packet.vlan == VLAN-10

Я попробовал следующее

var regexp = /(\=.+)/g;
string.replace(regexp, ("==" + "VLAN-10");

выбор должен останавливаться при следующем OR/AND. В случае, например, выше выбор должен остановиться до начала строки ip.

Теги:

5 ответов

1
Лучший ответ

Ваше регулярное выражение означает "найти знак" = ", за которым следует один или несколько символов".

Вы можете посмотреть https://regex101.com/, которые предоставляют визуальные способы отладки регулярных выражений.

try string.replace(/(packet\.vlan == )(\d+)/, "$1VLAN-$2");

Примечание: "строка" - действительно плохое имя переменной.

  • 0
    OP не хочет заменять packet.vlan необходимо packet.vlan только значение.
  • 1
    @ Ты прав, мне пришлось обновить свой ответ :)
1

Вы можете использовать регулярное выражение для замены строки, g идентификатор в RegExp используется как global соответствие (найти все совпадения, а не останавливаться после первого совпадения).

var string = "application == xyz AND location == abc AND packet.vlan == 10 OR ip == 1.1.1.1"

var temp = new RegExp("packet.vlan == 10", "g");
console.log(string.replace(temp, "packet.vlan == VLAN-10"));

Чтобы заменить единственное первое вхождение packet.vlan == 10 с VLAN-10, вы можете просто использовать .replace().

var string = "application == xyz AND location == abc AND packet.vlan == 10 OR ip == 1.1.1.1 AND packet.vlan = 11.1.1.1.11"
console.log(string.replace("packet.vlan == 10", "packet.vlan == VLAN-10"));
  • 0
    OP не хочет заменять packet.vlan необходимо packet.vlan только значение.
  • 1
    Обновленный ответ :)
0

Так как мне пришлось найти строку, которая является пакетом.xxx, и замените ее на значение. Я должен был пройти и найти строку, которая состоит из пакета. и замените его с помощью регулярного выражения.

ПРИМЕЧАНИЕ. В пакете.xxx xxx может быть любым динамическим значением.

0

Попробуйте это,

const regex = /packet.vlan == (\d+)/g;
const str = 'application == xyz AND location == abc AND packet.vlan == 10 OR ip == 1.1.1.1';
const subst = 'packet.vlan == VLAN-$1';

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

См. Regex: https://regex101.com/r/93AfJr/1

ИЛИ ЖЕ

const str = 'application == xyz AND location == abc AND packet.vlan == 10 OR ip == 1.1.1.1';
var newstr = str.replace(/packet.vlan == 10/i, 'packet.vlan == VLAN-10');
console.log(newstr);
0

Решение состоит в том, чтобы переписать ваше регулярное выражение:

var regexp = /(==\s)(.+\b)/g;  //all chars from ==whitespace until next word boundery
    var s = "packet.VLAN == 10".replace(regexp, "== VLAN-$2"); //$2 to refer to the capturing group
    console.log(s);

Однако с этими сложными строками sql я бы использовал другой JavaScript для обеспечения большего контроля. Взглянуть:

var SQLString = "application == xyz AND location == abc AND packet.vlan == 10 OR ip == 1.1.1.1";


var edit = SQLString.split(/AND|OR/i); //split on and or
var andOrs = SQLString.match(/AND|OR/ig); //create an array with and an or.
edit.forEach(function(value, index, arr){
    //loop the array
    var prop = value.substr(0, value.trim().search(/\s/)+1).trim(); //trim the whitespaces.
    switch(prop){
       case "packet.vlan" :
           arr[index] = "packet.vlan == VLAN-" +value.split("==")[1].trim();
       break;
    }
    
    //add the original and or to it.
    andOrs[index] ? arr[index] = arr[index].trim() + " " + andOrs[index].trim() : null;
});

SQLString = edit.join(" "); //join the array parts with a whitespace.
console.log(SQLString);

В заключение. Мне любопытно, почему JavaScript необходим для перезаписи строк SQL?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню