2016-09-13 1 views
1

После Split string that used to be a list, я делаю это:Интеллектуальное регулярное выражение, чтобы понять вход

console.log(lines[line]); 
var regex = /(-?\d{1,})/g; 
var cluster = lines[line].match(regex); 
console.log(cluster); 

, который даст мне это:

((3158), (737)) 
["3158", "737"] 

где 3158 будет последним рассматриваться в качестве идентификатора в моей программе и 737 связанные данные.

мне интересно, если есть способ, чтобы обработать входы этого вида тоже:

((3158, 1024), (737)) 

где ID будет пара, и сделать что-то вроде этого:

var single_regex = regex_for_single_ID; 
var pair_regex = regex_for_pair_ID; 
if(single_regex) 
    // do my logic 
else if(pair_regex) 
    // do my other logic 
else 
    // bad input 

является то, что возможное?


Разъяснение:

То, что я заинтересован в лечит два случая по-разному. Например одно решение будет иметь такое поведение:

((3158), (737)) 
["3158", "737"] 

и для пар, сцепить ID:

((3158, 1024), (737)) 
["31581024", "737"] 
+0

Позвольте пояснить, вы ожидаете получить вход '((3158, 1024), (737))' и вы хотите совместить '3158, 1024' как единый идентификатор, это правильно? Или вы ожидаете сопоставить '3158' как идентификатор и' 1024' в качестве идентификатора и вернуть два идентификатора? – vlaz

+0

Одиночная или пара '(-? \ D +) (?: \ S *, \ s * (-? \ D +))?' Или '-? \ D + (? \ S *, \ s * -? \ D +) ? 'или' (-? \ d + (? \ s *, \ s * -? \ d +)?) 'Это зависит от того, что вы хотите видеть запятой в массиве и т. д. – sln

+0

vlaz обновлен. @sln хм, это правильно? Я имею в виду, что все регулярное выражение у вас есть в коде? Оба будут приводить к синтаксической ошибке, если я делаю 'var regex = ..."; ' – gsamaras

ответ

2

Для простой, вы можете использовать .replace(/(\d+)\s*,\s*/g, '$1'), чтобы объединить номера/конкатенации в паре, а затем использовать простой матч регулярного выражения, которые вы уже используете.

Пример:

var v1 = "((3158), (737))"; // singular string 

var v2 = "((3158, 1024), (737))"; // paired number string 

var arr1 = v1.replace(/(\d+)\s*,\s*/g, '$1').match(/-?\d+/g) 
//=> ["3158", "737"] 

var arr2 = v2.replace(/(\d+)\s*,\s*/g, '$1').match(/-?\d+/g) 
//=> ["31581024", "737"] 

Мы используем это регулярное выражение в .replace:

/(\d+)\s*,\s*/ 
  • Это соответствует и группе 1 или более цифр с последующих дополнительными пространствами и запятой.
  • В качестве замены мы используем $1, который является обратной ссылкой на номер, который мы сопоставляем, таким образом удаляя пробелы и запятую после номера.
+0

Отлично, это сработает. Не могли бы вы пояснить пояснение регулярного выражения? Я пытаюсь понять их и узнать ... :) – gsamaras

+0

Добавлено краткое описание функции '.repalce'. Для 'match' я повторно использую такое же регулярное выражение, которое у вас уже есть. – anubhava

2

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

/\((-?\d+), (-?\d+)\)|\((-?\d+)\)/g 

См regex demo

Детали:

  • \((-?\d+), (-?\d+)\) - это (, ряд (захватывается в 1-й группе), в ,, пространство, другой номер пары (захваченной в группе 2) и )
  • | - или
  • \((-?\d+)\) - a (, затем номер (захвачен в группу 3) и ).

var re = /\((-?\d+), (-?\d+)\)|\((-?\d+)\)/g; 
 
var str = '((3158), (737)) ((3158, 1024), (737))'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    if (m[3]) { 
 
    res.push(m[3]); 
 
    } else { 
 
    res.push(m[1]+m[2]); 
 
    } 
 
} 
 
console.log(res);

+0

Wiktor отлично, что будет делать трюк, но не существует способа заставить 'res' удерживать другие данные? Это 737. Таким образом, для примера, он будет давать '[" 3158 "," 737 "]' и '[" 31581024 "," 737 "]' вместо '[" 3158 "]' и '[" 31581024 «]'. – gsamaras

+0

Да, что бы вы там ни выбрали. Не стесняйтесь настраивать код в соответствии с вашими потребностями. Дело в том, что если группа 3 соответствует ('if (m [3])'), мы знаем, что у нас есть одно число, иначе у нас есть группа 1 и группа 2, которые вы можете комбинировать или делать по своему усмотрению. –

Смежные вопросы