Разделить строку с регулярным выражением с проблемами чисел - PullRequest
0 голосов
/ 20 февраля 2019

Имея список строк вроде:

Client Potential XSS2Medium
Client HTML5 Insecure Storage41Medium
Client Potential DOM Open Redirect12Low

Я хотел бы разбить каждую строку на три строки, например:

["Client Potential XSS", "2", "Medium"]

Я использую это регулярное выражение:

/[a-zA-Z ]+|[0-9]+/g)

Но со строками, которые содержат другие числа, это, очевидно, не работает.Например, с:

Client HTML5 Insecure Storage41Medium

результат:

["Client HTML", "5", " Insercure Storage", "41", "Medium"]

Я не могу найти регулярное выражение, которое выдает:

["Client HTML5 Insercure Storage", "41", "Medium"]

Это регулярное выражение работает на регулярное выражение101.com:

(.+[ \t][A-z]+)+([0-9]+)+([A-z]+)

Использование в моем коде:

data.substring(startIndex, endIndex)
        .split("\r\n") // Split the vulnerabilities
        .filter(item => !item.match(/(-+)Page \([0-9]+\) Break(-+)/g) // Remove page break
          && !item.match(/PAGE [0-9]+ OF [0-9]+/g) // Remove pagination
          && item !== '') // Remove blank strings
        .map(v => v.match(/(.+[ \t][A-z]+)+([0-9]+)+([A-z]+)/g));

не работает.

Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: Все строки заканчиваются High, Medium и Low.

Ответы [ 6 ]

0 голосов
/ 20 февраля 2019

const text = `Client Potential XSS2Medium
Client HTML5 Insecure Storage41Medium
Client Potential DOM Open Redirect12Low`


const res = text.split("\n").map(el =>  el.replace(/\d+/g, a => ' ' + a + ' ') );

console.log(res)
0 голосов
/ 20 февраля 2019

let arr = ["Client Potential XSS2Medium",
"Client HTML5 Insecure Storage41Medium",
"Client Potential DOM Open Redirect12Low"];    

let re = /^.+[a-zA-Z](?=\d+)|\d+(?=[A-Z])|[^\d]+\w+$/g;


arr.forEach(str => console.log(str.match(re)))

^.+[a-zA-Z](?=\d+) Совпадение начала строки, за которым следует a-zA-Z, за которым следуют один или несколько цифр

\d+(?=[A-Z]) Совпадение с одним или несколькими цифрами, за которыми следуетсимволом верхнего регистра

[^\d]+\w+$ Отрицаемые цифры, за которыми следуют совпадающие символы слова до конца строки

0 голосов
/ 20 февраля 2019

Проблема в вашем глобальном флаге g.

Удалите этот флаг из этой строки: .map(v => v.match(/(.+[ \t][A-z]+)+([0-9]+)+([A-z]+)/g));, чтобы сделать его:

.map(v => v.match(/(.+[ \t][A-z]+)+([0-9]+)+([A-z]+)/));


Кроме того, вы могли бы сделать регулярное выражение намного проще, как показано @bhmahler:

.map(v => v.match(/(.*?)(\d+)(low|medium|high)/i));

0 голосов
/ 20 февраля 2019

Здесь у вас есть одно решение, заключающее число перед словами High, Low или Medium с пользовательским token с использованием String.replace() и, наконец, разделив получившуюся строку на эту token:

const inputs = [
  "Client Potential XSS2High",
  "Client HTML5 Insecure Storage41Medium",
  "Client Potential DOM Open Redirect12Low"
];

let token = "-#-";
let regexp = /(\d+)(High|Low|Medium)$/;

let res = inputs.map(
    x => x.replace(regexp, `${token}$1${token}$2`).split(token)
);

console.log(res);

Другим решением является использование этого регулярного выражения: /^(.*?)(\d+)(High|Low|Medium)$/i

const inputs = [
  "Client Potential XSS2High",
  "Client HTML5 Insecure Storage41Medium",
  "Client Potential DOM Open Redirect12Low"
];

let regexp = /^(.*?)(\d+)(High|Low|Medium)$/i;

let res = inputs.map(
    x => x.match(regexp).slice(1)
);

console.log(res);
0 голосов
/ 20 февраля 2019

Вы можете использовать обходной путь (то есть матч или захват, а затем заменить):

let strings = ['Client Potential XSS2Medium', 'Client HTML5 Insecure Storage41Medium', 'Client Potential DOM Open Redirect12Low', 'Client HTML5 Insecure Storage41Medium'];

let regex = /(?:HTML5|or_other_string)|(\d+)/g;

strings.forEach(function(string) {
    string = string.replace(regex, function(match, g1) {
        if (typeof(g1) != "undefined") {
            return "#@#" + g1 + "#@#";
        }
        return match;
    });
    string = string.split("#@#");
    console.log(string);
});

См. Дополнительную демонстрацию на regex101.com .

0 голосов
/ 20 февраля 2019

Следующее регулярное выражение должно дать вам то, что вы ищете.

/(.*?)(\d+)(low|medium|high)/gi

Вот пример https://regex101.com/r/AS9mvf/1

Вот пример работы с картой

var entries = [
  'Client Potential XSS2Medium',
  'Client HTML5 Insecure Storage41Medium',
  'Client Potential DOM Open Redirect12Low'
];

var matches = entries.map(v => {
  var result = /(.*?)(\d+)(low|medium|high)/gi.exec(v);
  return [
    result[1],
    result[2],
    result[3]
  ];
});

console.log(matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...