У меня есть несколько строк, которые я хотел бы сопоставить с образцом, а затем извлечь совпадения в виде переменных $ 1, $ 2 и т. Д.
У меня есть код сопоставления с образцом
a = /^([\+|\-]?[1-9]?)([C|P])(?:([\+|\-][1-9]?)([C|P]))*$/i.match(field)
ставит result = #{a.to_a.inspect}
С учетом вышеизложенного я могу легко сопоставить следующие примеры строк:
"C", "+ 2C", "2c-P", "2C-3P "," P + C "
И я подтвердил все эти работы на веб-сайте Rubular.
Однако, когда я пытаюсь сопоставить" + 2P-c-3p ",однако он соответствует «массивоподобному объекту» MatchData:
result = ["+2P-C-3P", "+2", "P", "-3", "P"]
Проблема в том, что я не могу извлечь в массив средний шаблон «-C».
То, что я ожидал бы увидеть, это:
result = ["+2P-C-3P", "+2", "P", "-", "C", "-3", "P"]
Кажется, что извлекается только конечная часть "-3P" как "-3" и "P"
Кто-нибудь знает, как я могу изменить свой шаблон для захвата средних матчей?
Так что в качестве другого примера, + 3c + 2p-c-4p, я ожидал бы создать:
["+3c+2p-c-4p", "+3", "C", "+2", "P", "-", "C", "-4", "P"]
но то, что я получаю это
["+3c+2p-c-4p", "+3", "C", "-4", "P"]
который комполностью пропускает среднюю часть.