2

外部ソースからのユーザー情報があり、そのユーザーがアクティブかどうかを確認する必要があります。ユーザーとサーバーがある場合もあれば、User@Server がある場合もあります。前者のケースは問題ありません。

active(User, Server) ->
    do whatever.

User@Server ケースでやりたいことは次のようなものです。

active([User, "@", Server]) ->
    active(User, Server).

うまくいかないようです。たとえば、erlang ターミナルで a@b を使用して active を呼び出すと、一致するものがないというエラーが表示されます。どんな助けでも大歓迎です!

4

2 に答える 2

4

文字列をトークン化して、結果を取得できます。

active(UserString) ->
    [User,Server] = string:tokens(UserString,"@"),
    active(User,Server).

より複雑なものが必要な場合、または電子メールアドレスなどの処理を改善する必要がある場合は、reモジュールで正規表現を使用する方法を検討する必要があります。

active(UserString) ->
    RegEx = "^([\\w\\.-]+)@([\\w\\.-]+)$",
    {match, [User,Server]} = re:run(UserString,RegEx,[{capture,all_but_first,list}]),
    active(User,Server).

注:提供されている正規表現は、電子メールアドレスの検証には十分ではありません\\w。これは、アンダースコア( )、ドット(\\.)、ダッシュ( )を含むすべての英数字を-アットマークで区切ることができる単なる例です。そして、一致が文字列の全長を引き伸ばさない場合は失敗します:(^から$)。

于 2013-01-16T21:57:18.143 に答える
3

パターン マッチングに関するメモ。問題の実際の解決策として、@chops の提案を使用する必要があると思います。

文字列に対してパターンを照合する場合、erlang の文字列は実際には整数のリストであることを覚えておくと便利だと思います。したがって、文字列は実際には(64 は の ASCII コード)"@"と同じです。[64]@

これは、 pattern[User, "@", Server]が のようなリストに一致することを意味しますが、 (リスト形式では) には一致し[97,[64],98]ません。"a@b"[97,64,98]

文字列を一致させるには、[User,$@,Server]. 演算子は、文字の$ascii 値を提供します。

ただし、この一致パターンでは、一致する文字列が 1 文字に制限され@、その後に 1 文字が続きます...

[User, $@ | Server]サーバー部分を任意の長さにできるようにすることで改善できますが、User変数は依然として1文字にしか一致しません(それを回避する方法はわかりません)。

于 2013-01-16T23:37:10.460 に答える