Не захватить групповой матч в Ruby Regex - PullRequest
2 голосов
/ 28 января 2010

Я пытаюсь разбить следующую строку:

"@command Text1 @command2 Text2"

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

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

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

Text1
@ 
Text2

Мой вопрос: как я могу извлечь Text1 и Text2, имея в виду, что выражение должно прекратить сопоставлять как "@", так иконец строки?

Ответы [ 5 ]

5 голосов
/ 28 января 2010

Если вы хотите использовать группу без захвата?:

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

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

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

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

1 голос
/ 28 января 2010

В вашем регулярном выражении вам не нужны скобки вокруг '@ | $'. Следующее выполнит то же самое без возврата @ в отдельной группе совпадений:

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

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

1 голос
/ 28 января 2010
text.scan(/@* (.*?)(?:@|$)/)'
0 голосов
/ 28 января 2010

Как выглядит это регулярное выражение? http://rubular.com/regexes/13264

0 голосов
/ 28 января 2010

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

text.scan(/@[^\s]* ([^@]*)/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...