Заменить несколько строк в строке с помощью регулярного выражения - PullRequest
0 голосов
/ 13 декабря 2018

На странице x мы отображаем действия, зарегистрированные на объекте.Активы хранятся в многозначном поле Notes.

значение может быть следующим:

2018-12-12 09:36 Jane Doe SysTest / Web / ACME ¤verb_created¤ ¤subj_document¤ в приложении «target_custDB»

Я отображаю поле с помощью повторного управления.В повторе у меня есть вычисляемый текстовый элемент управления со значением:

var str = obj;
var regexp = /\¤(.*?)\¤/;
var translations = regexp.exec(str);
if (null != translations){
    for (i = 0; i < translations.length; i++) { 
        if(null != regexp.exec(str)){
            trans = regexp.exec(str)[0];
            //verb first
            if (null != trans){
                str = regexp.replace(str, history[trans]);
            }
        }
    }
}
return str;

history - это ссылка на файл history.properties, в котором находятся все переводы пары ключ-значение.

Код отлично работает для первых 2 значений.Все дополнительные значения остаются в исходном значении. Eg¤target_custDB¤

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

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете использовать регулярное выражение с глобальным модификатором и передать метод обратного вызова в качестве аргумента замены, чтобы получить соответствующие значения:

var history1 = {'verb_created': '2018', 'subj_document': 'DOCUMENT', 'target_custDB': 'TARGET'};
var str = "2018-12-12 09:36 Jane Doe SysTest/Web/ACME ¤verb_created¤ ¤subj_document¤ in application ¤target_custDB¤";
var regex = /¤(\w+)¤/g;
str = str.replace(regex, function($0,$1) { return history1[$1] ? history1[$1] : $0;});
console.log(str);

Регулярное выражение /¤(\w+)¤/g будет соответствовать нескольким вхождениям

  • ¤ - ¤ char
  • (\w+) - группа 1: одна или несколько букв ASCII, цифр или _
  • ¤ - ¤ символ.

Логика замены: если естьпара ключ-значение с ключом группы 1, это значение возвращается для замены, в противном случае соответствие вставляется обратно в результат.

Чтобы просто извлечь эти подстроки, используйте

var str = "2018-12-13 16:50 Anna User SysTest/Web/ACME ¤verb_created¤ ¤subj_document¤";
var regex = /¤(\w+)¤/g;
var translations = [], m;
while (m = regex.exec(str)) {
  translations.push(m[1]);
}
console.log(translations);
...