2010-01-28 3 views
2

Я пытаюсь сломать следующую строку:Не захватить матч группы в Руби Regex

"@command Text1 @command2 Text2" 

в Ruby. Я хочу вывести «Text1» и «Text2» в массив. Для этого я использую метод сканирования и с помощью этого:

text.scan(/@* (.*?)(@|$)/) 

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

Text1 
@ 
Text2 

Мой вопрос, как я могу вытащить Text1 и Text2 имея в виду выражение необходимо остановить соответствие в обоих «@» и в конце строка?

ответ

5

Если вы хотите использовать, не захватывая группы:

text.scan(/@* (.*?)(?:@|$)/) 

Как Замечание, регулярное выражение выглядит, как он может содержать ошибку. Возможно, вы это имели в виду?

text.scan(/@\w+ (\w+)(?= @|$)/) 

Разница заключается в том, что ваше выражение совпадает с " foo", который я предполагаю, что это не намеренно.

1

В вашем регулярном выражении вам не нужны круглые скобки вокруг «@ | $». Далее будет сделать то же самое без «@» возвращается в отдельном матче группы:

text.scan(/@* (.*?)[@\$]/) 

Поскольку вы ищете только для одного символа в этой группе, квадратные скобки будут соответствовать любому символу в их.

0

Вот как я это сделать:

text.scan(/@[^\s]* ([^@]*)/) 
Смежные вопросы