3

Webフォームの結果がテキストメールで送信されているので、そこからすべての値を解析する必要があります。特定のキーの結果を返すことができる単一の正規表現が欲しいのですが。

String Pattern = String.Format("^.*{0}:\s*(?<mail><mailto\:)?(.*)(?(mail)>)\s*$", InputString);

次の2つのオプションを有効にしています。RegexOptions.IgnoreCase | RegexOptions.Multiline

解析する必要のあるテキストの一部を次に示します。

City:     Test City
Country:  Mycountry

Phone:    212
Fax:      
E-Mail:   <mailto:mymail@example.com>

これは、値がない場合を除いて、うまく機能していますFaxFaxInputStringとして入力すると、次の完全な行E-Mail: <mailto:mymail@example.com>が返されます。結果がないか、空の結果が欲しいです。

4

2 に答える 2

1

ここでの問題は、使用RegexOptions.SingleLineして.いないために一致しない場合でも\n\s文字クラス一致すること\nです。

\sこれを修正するには、のすべてのインスタンスをに置き換えます[^\S\r\n]。つまり、「空白(改行を含む)」に一致させるのではなく、「not(非空白または改行)」に一致させます。

string pattern = String.Format(
    @"^[^\S\r\n]*{0}:[^\S\r\n]*(?<mail><mailto\:)?(.*)(?(mail)>)[^\S\r\n]*$",
    "Fax");

ただし、別の問題が残ります。つまり、RegexOptions.Multilineを意味する^$一致するため、一致の改行がである場合は、一致\nの末尾が残ります。\r\r\n

これを回避するには、を使用することはできませRegexOptions.Multilineが、代わりに、手動で改行に一致するとに置き換え^てください。(?<=^|\r\n)$(?=$|\r\n)\r\n

于 2013-02-08T08:41:40.227 に答える
0

これは、抽出のためにアイテムを辞書に配置するパターンとコードです。値が空の場合、そのキーはディクショナリで有効ですが、そのkeに含まれるか返される値はnullです。

string data = @"City: Test City
Country: Mycountry
Phone: 212
Fax:
E-Mail: <mailto:mymail@example.com>";

string pattern = @"^(?<Key>[^:]+)(?::)(?<Value>.*)";

var resultDictionary =

Regex.Matches(data, pattern, RegexOptions.Multiline)
     .OfType<Match>()
     .ToDictionary (mt => mt.Groups["Key"].Value, mt => mt.Groups["Value"].Value);

/* resultDictionary is a dictionary with these values:

City      Test City
Country   Mycountry
Phone     212
Fax
E-Mail  <mailto:mymail@example.com>
*/
于 2013-02-07T18:59:13.760 に答える