2015-08-31 5 views
4

Я думаю, что название говорит все. Я пытаюсь собрать группы и объединить их вместе.Группа обратного захвата, объединенная с группой прямого захвата

У меня есть этот текст:

GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48 

И я хочу этот вывод:

IDENTIFIER 10.802.123/3843-48 

Так что я хочу, прямо скажем, я хочу, чтобы захватить одну группу перед этим словом и после, то сцепить оба, только с использованием regex. Это возможно?

я уже могу извлечь 48 так:

var text = GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48 
var reg = new RegExp('IDENTIFIER' + '.*?(\\d\\S*)', 'i'); 
var match = reg.exec(text); 

Выход:

48 

Можно ли это сделать?

Я предлагаю 200 баллов.

+0

Вы не можете сделать так .. –

+0

есть ли способ, что я могу решить эту проблему? –

ответ

3

Необходимо точно определить группы, которые вы хотите извлечь до и после слова. Если вы определяете группу перед словом как четыре или более символа без пробелов, а группа после слова как один или несколько символов без пробелов, вы можете использовать следующее регулярное выражение.

var re = new RegExp('(\\S{4,})\\s+(?:\\S{1,3}\\s+)*?' + word + '.*?(\\S+)', 'i'); 
var groups = re.exec(text); 
if (groups !== null) { 
    var result = groups[1] + groups[2]; 
} 

Позвольте мне сломать регулярное выражение. Обратите внимание, что нам нужно избежать обратных косых черт, потому что мы пишем регулярное выражение внутри строки.

  • (\\S{4,}) захватывает группу из четырех или более непробельных символов
  • \\s+ матчи один или несколько пробельных символов
  • (?: указывает на начало, не захватывая группы
  • \\S{1,3} матчи 2:59 не являющиеся -безопасные символы
  • \\s+ соответствует одному или нескольким символам пробела
  • )*? делает не-захвата матч группы ноль или более раз, а несколько раз в качестве возможных
  • word матчей все, что было в переменной word, когда регулярное выражение было составлено
  • .*? соответствует любому символу ноль или более раз, а несколько раз как можно
  • (\\S+) захватывает один или более не пробельные символы
  • 'i' флага делает это не чувствителен к регистру регулярного выражения

Обратите внимание, что наше использование модификатора ? позволяет нам захватывать ближайшие группы до и после слова.

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

function forward_and_backward(word, text) { 
 
    var re = new RegExp('(\\S{4,})\\s+(?:\\S{1,3}\\s+)*?' + word + '.*?(\\S+)', 'ig'); 
 
    // Find all matches and make an array of results. 
 
    var results = []; 
 
    while (true) { 
 
    var groups = re.exec(text); 
 
    if (groups === null) { 
 
     return results; 
 
    } 
 
    var result = groups[1] + groups[2]; 
 
    results.push(result); 
 
    } 
 
} 
 

 
var sampleText = " GPX 10.802.123/3843- 1 -- IDENTIFIER 48 A BC 444.2345.1.1/99x 28 - - Identifier 580 X Y Z 9.22.16.1043/73+ 0 *** identifier 6800"; 
 

 
results = forward_and_backward('IDENTIFIER', sampleText); 
 
for (var i = 0; i < results.length; ++i) { 
 
    document.write('result ' + i + ': "' + results[i] + '"<br><br>'); 
 
}
body { 
 
    font-family: monospace; 
 
}

+0

отлично, ты потрясающий !!! Увидимся через два дня hahaha –

+0

У вас есть интерес к победе в 100 очках? -> http://stackoverflow.com/questions/32361120/sum-two-capture-groups –

+0

Майкл, мне нужна помощь в другом вопросе http://stackoverflow.com/questions/32460978/4-capture-groups-in- javascript-regex У меня только 100 очков сейчас, я могу дать вам 50. –

3

Вы можете сделать:

var text = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48'; 
var match = /GPX\s+(.+?) \d .*?(IDENTIFIER).*?(\d\S*)/i.exec(text); 

var output = match[2] + ' ' + match[1] + '-' + match[3]; 
//=> "IDENTIFIER 10.802.123/3843­-48" 
1

Это было бы возможно через функцию замены.

var s = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48' 
s.replace(/.*?(\S+)\s+\d+\s*-\s*(IDENTIFIER)\s*(\d+).*/, "$2 $1-$3") 
1
^\s*\S+\s*\b(\d+(?:[./]\d+)+)\b.*?-.*?\b(\S+)\b\s*(\d+)\s*$ 

Вы можете попробовать this.Replace по $2 $1-$3 .Увидь демо.

https://regex101.com/r/sS2dM8/38

var re = /^\s*\S+\s*\b(\d+(?:[.\/]\d+)+)\b.*?-.*?\b(\S+)\b\s*(\d+)\s*$/gm; 
var str = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48'; 
var subst = '$2 $1-$3'; 

var result = str.replace(re, subst); 
0

Вы можете использовать раскол тоже:

var text = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48'; 

var parts = text.split(/\s+/); 

if (parts[4] == 'IDENTIFIER') { 
    var result = parts[4] + ' ' + parts[1] + '-' + parts[5]; 
    console.log(result); 
} 
Смежные вопросы