2

正規表現を使用して以下を取得しようとしています。

これはサンプル入力です:

-emto=USER@HOST.COM -emfrom=USER@HOST.COM -emsubject="MYSUBJECT" 

その他の入力:

-emto=USER@HOST.COM -emfrom=USER@HOST.COM -emcc=ME@HOST.COM -embcc=YOU@HOST.COM -emsubject="MYSUBJECT" 

私が達成したいのは、テキスト after を使用して名前付きグループを取得することです-em。したがって、たとえば、グループ EMAIL_TO、EMAIL_FROM、EMAIL_CC、... グループ名を連結してコードを使用してキャプチャできることに注意してください。問題ありません。

問題は、オプションのグループを「ランダムな」位置でキャプチャする方法がわからないことです。たとえば、CC と BCC は常に表示されるとは限りませんが、表示される場合があり、それらをキャプチャする必要があります。

誰かがこれについて私を助けることができますか?!

私がこれまでに持っているもの:(?:-em(?<EMAIL_>to|cc|bcc|from|subject)=(.*))

4

1 に答える 1

4

次のようなことをしてください:

-em([^\s=]+)=([^\s]+)

スペースを含めることができるように、値の引用をサポートする必要がある場合:

-em([^\s=]+)=("[^"]*"|[^\s]+)

そして、コマンド ライン引数文字列内のすべての一致を反復処理します。一致ごとに、「キー」(最初のキャプチャ グループ) を見て、それが認識できるものかどうかを確認します。そうでない場合は、エラー メッセージを表示して終了します。そうである場合は、それに応じてオプションを設定します (2 番目のキャプチャ グループは「値」です)。

POSTSCRIPT:これは、コンピューター言語の文法を書くときによく発生する状況を思い出させます。

構文的に完全なプログラムに対してのみ機能する文法を書くことは可能です (おそらく自然なことです)。しかし、適切なエラー報告を行うには、構文的に正しいプログラムのスーパーセットを受け入れる文法を作成する方がはるかに優れています。解析ツリーを取得したら、解析ツリーを実行してエラーを探し、アプリケーション固有のコードを使用して報告できます。

この場合、実際に受け入れるオプションのみに一致する正規表現を書くことができます。しかし、誰かがオプションのタイプを間違えると、正規表現は単純に一致しなくなります。コマンド ライン引数-emsubjcet=something@@#$*(#&U*REJDFFKDSJ**&#(*$&##.

POST-POSTSCRIPT:「区切り文字 + 区切り文字ではない任意の数の文字」に一致する非常に一般的な正規表現パターンに注意してください。上記の正規表現では、これをここで見ることができます: ([^\s=]+)=-- 空白ではない 1 つ以上の文字または = の後に = が続きます。これにより、キーの一部であるすべてを簡単に食べることができますが、行き過ぎて delimiting と一致することはありません=。ここでもそれを見ることができます: "[^"]*"-- 引用符の後に、引用符ではない 0 個以上の文字が続き、その後に終了引用符が続きます。

于 2013-05-13T11:09:58.643 に答える