Как удалить цитату из следующего регулярного выражения на ruby? - PullRequest
1 голос
/ 10 февраля 2012

У меня есть следующее регулярное выражение:

/["]*(?<name>.*)[\"]*?\s*[<(](?<email>\w.*)[>)]/.match("\"The Boss\" <daboss@aol.com>")

и я получаю следующий результат:

name = The Boss"
email = daboss@aol.com

Как мне избавиться от последней цитаты на Боссе "???

Не стесняйтесь рефакторинг моего регулярного выражения, чтобы сделать его более чувственным ...

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Проблема в том, что (?<name>) - это .*, который будет есть все, включая двойные кавычки.Простой способ исправить это - изменить его на .*?.(Это неохотное сопоставление; оно сопоставляет как можно меньше символов, а не столько, сколько возможно.)

Другой способ сделать это - использовать [^"]* вместо .*.

Здесь есть важный урок о регулярных выражениях: всякий раз, когда вы пишете регулярное выражение, не просто думайте о том, что вы хотите сопоставить;подумайте о том, что вы не хотите сопоставить. очень общий источник ошибок с регулярными выражениями совпадает слишком много .

1 голос
/ 10 февраля 2012

Возможно, вы хотите запретить кавычки в имени.Это исправит ваш пример:

/["]*(?<name>[^"]*)[\"]*?\s*[<(](?<email>\w.*)[>)]/.match("\"The Boss\" <daboss@aol.com>")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...