2015-03-26 3 views
-1

От:Рубин Regexp Match Строка Точно

[email protected];@[email protected];@[email protected]; [email protected];@200 

To:

id=14291 name=yfsun [email protected]; .NET code=200 

Мои регулярные выражения:

/^(?<id>[^@]*)@;@(?<name>[^@]*)@;@(?<msg>[^@]*)@;@(?<code>[^@]*)$/ 

Как вы можете видеть, msg часть будет проблемой, потому что msg может содержать строку @.

Любая идея? Спасибо

+1

Не вижу, пожалуйста, объясните, что вы хотите или ожидаете, и что вам нужно в деталях. – Beartech

+1

Просто измените группу 'msg' named на жадность. '(? . *)' – hwnd

+0

@hwnd приятно, вот что я хочу, спасибо. – Cynial

ответ

2

Если <code> является последней названной группой, вы можете просто изменить <msg> быть greedy.

(?<msg>.*) 

Rubular

1

Я не понимаю, почему простое регулярное выражение не будет делать. Я что-то пропускаю?

str = "[email protected];@[email protected];@[email protected]; [email protected];@200" 

id, name, msg, code = str.split(/@;@/) 
id = id.to_i  #=> 14291 
name    #=> "yfsun" 
msg    #=> "[email protected]; .NET" 
code = code.to_i #=> 200 
+0

Простой, это было бы более эффективно ('+ 1') – hwnd

+0

Мне нужно использовать регулярное выражение для этого, потому что это конфиг приложения, только поддержка регулярного выражения, поэтому нельзя использовать функцию split ... – Cynial

+0

Но аргумент' split' является регулярным выражением (хотя это может быть строка). Вы должны использовать какой-либо метод (вероятно, 'scan' или' split') в сочетании с регулярным выражением. Вы не можете использовать регулярное выражение для чего-либо. –

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