@message_to = "bob@google.com"
@cleaned = @message_to.match(/^(.*)+@/)
@cleaned gibt bob @ zurück, wo ich nur bob zurückgeben möchte. Mache ich die Regex mit Rubin richtig?
Vielen Dank
Antworten:
2 für die Antwort № 1Du willst das:
@cleaned = @message_to.match(/^(.*)+@/)[1]
match
gibt a zurück MatchData
Objekt und die String-Version davon ist die gesamte Übereinstimmung, die erfassten Gruppen sind ab Index 1 verfügbar, wenn Sie das behandeln MatchData
als ein Array.
Ich würde wahrscheinlich mit so etwas mehr gehen:
@cleaned = @message_to.match(/^([^@]+)@/)[1]
5 für die Antwort № 2
Kein regelmäßiger Ausdruck nötig
>> @message_to = "bob@google.com"
=> "bob@google.com"
>> @message_to.split("@",2)
=> ["bob", "google.com"]
>> @message_to.split("@",2)[0] if @message_to["@"]
=> "bob"
>>
1 für die Antwort № 3
Es gibt eine kürzere Lösung:
@cleaned = @message_to[/[^@]+/]
1 für die Antwort № 4
Ein noch kürzerer Code als mu_is_too_short wäre:
@cleaned = @message_to[/^([^@]+)@/, 1]
Das Zeichenfolge # [] Methode kann einen regulären Ausdruck annehmen.
0 für die Antwort № 5
Das einfachste RegEx, das ich in der IRB-Konsole arbeiten konnte, ist:
@message_to = "bob@google.com"
@cleaned = @message_to.match(/(.+)@/)[1]
Auch daraus Verknüpfung du könntest es versuchen:
@cleaned = @message_to.match(/^(?<local_part>[wW]*?)@/)[:local_part]
0 für die Antwort № 6
Die naheliegendste Möglichkeit, Ihren Code anzupassen, ist die Verwendung einer positiven Assertion nach vorne. Anstelle von "Match" bob@
"Sie sagen jetzt" passen zusammen bob
, wenn ein a folgt @
"
@message_to = "bob@google.com"
@cleaned = @message_to.match(/^(.*)+(?=@)/)
Ein weiterer Punkt, wann man Regex benutzen und nicht verwenden soll: Ja, die Verwendung eines Regex ist in diesem Fall etwas sinnlos. Wenn Sie jedoch einen regulären Ausdruck verwenden, ist es einfacher, auch eine Bestätigung hinzuzufügen:
@cleaned = @message_to.match(/^(([-a-zA-Z0-9!#$%&"*+/=?^_`{|}~]+.)*[-a-zA-Z0-9!#$%&"*+/=?^_`{|}~]+(?=@)/)
(und ja, alle diese sind in E-Mail-Adressen gültig)