2015-10-26 6 views
3

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

([0-9]*)([ABCD])*: Фиксирует количество правильно, но только последняя буква

([0-9]*)(([ABCD])*): Фиксирует количество правильно, но сначала все буквы в одной группе, то только последняя буква в группе

Я понимаю, почему каждый из этих результатов происходит, но я не знаю, как это исправить. Как мне изменить регулярное выражение, чтобы дать мне несколько групп для совпадающих символов? Бонусные баллы, если я не получаю пустую группу ('' или undefined), если либо номера, либо букв нет.

Например:

1A => [1, А]

99 => [99]

CAB => [С, А, В]

1234ABCD => [1234, A, B, C, D]

+1

Как регулярное выражение знает, как долго каждая из групп? Можем ли мы иметь тестовые входные строки и результаты тестирования? –

+0

Несомненно, я приведу несколько примеров. – Jorn

+0

Можете ли вы запустить две отдельные функции соответствия? –

ответ

2

JavaScript не имеет встроенного метода для «соответствия всем». Так как вы знаете заранее, что все письма будет второй матч, вы можете разделить их сами:

var matches = "1234ABCD".match(/([0-9]*)([ABCD]*)/).slice(1); 
matches = [matches[0]].concat(matches[1].split("")); 
0

Поместите звездочку внутри группового захвата. Звездочка означает 0 или более, поэтому вы пытаетесь захватить 0 или более знаков из группового захвата, в этом случае ваш результат будет только первым захваченным письмом. Но вам нужно 0 или более букв A B C D.

([0-9]*)([ABCD]*) 
([0-9]*)([A-D]*) //same thing 

// UPDATE

var match = "".match(/([0-9]*)([ABCD]*)/) 

Этот код вернет вам массив с тремя позициями:

  1. Mathed текст
  2. совпавшей группа -> Всех номера
  3. Второй совпадающими группа -> Все буквы

Так разделить буквы, которые вы можете использовать

матч [2] .split ('');

+0

Это будет помещать буквы в группу захвата вместе, а не каждую в своей группе – Jorn

0

var test = document.getElementById('test'); 
 

 
function reTest() { 
 
    
 
    var re = /\b([0-9]*)([ABCD]*)\b/g; 
 
    var str = test.value; 
 
    var found = ""; 
 

 
    str.replace(re, function(fullmatch, numbers, letters) { 
 
    if (fullmatch == "") return; 
 
    letters = letters.split(""); 
 
    found += "<span class='num'>" + numbers + "</span>" 
 
    found += "<span class='letters'>" + letters + "</span>\n" 
 
    }); 
 
    
 
    document.getElementById('result').innerHTML = found; 
 
} 
 

 
reTest();
span.num { 
 
    color:red; 
 
} 
 

 
span.letters { 
 
    color:blue; 
 
}
<textarea rows="7" cols="40" id='test'> 
 
123ABC 
 
alpha 
 
12345defg 
 
bravo 
 
CAB 
 
19 
 
9876vwxyz 
 
...? 
 
</textarea><br/> 
 
<button onclick="reTest()">test</button><br/> 
 
<pre id='result'></pre>

1

Позвольте мне предложить новую стратегию: вместо того, чтобы пытаясь совместить целую цепочку в одну попытку, сопоставляйте каждое число или символ один раз с global modifier /g, чтобы вернуть все совпадения.

Regex

/^\d+|[ABCD]/g 
  • ^\d+ соответствует целому числу в начале строки
  • | ... или ...
  • [ABCD] 1 из четырех разрешенных символов.

Код

subject = "1234ABCD"; 
 
pattern = /^\d+|[ABCD]/g; 
 

 
matches = subject.match(pattern); 
 

 

 
console.log(matches); 
 
//=> ["1234", "A", "B", "C", "D"]

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