役に立つ方がどれだけいるか疑問ですが
SYSLOGパケットにマッチする正規表現を作ったので一応アップしておきます
IPv6アドレスマッチの部分を手を抜いてるのでアドレスは結局何でもマッチします(爆)
IPv6なんて嫌いだ~という人はIPv6アドレス部分を削除していただければ
IPv4アドレスはクラスCまでのアドレスのみマッチするようになってます
この場合 RegexOptions には CultureInvariant, ExplicitCapture, IgnorePatternWhitespace, Singleline を指定するのがオススメです
#region 優先度 正規表現パターン
// 文字列が < で始まり先頭が 0 の場合は後続に数字が続かず 3 文字の数値で最後が > の場合にマッチ
const string PriorityRegexPattern = @"
\A< # 文字列の先頭に < がある
(?<PRI> # 優先度を PRI にキャプチャする
(?!0[0-9]) # 先頭に 0 が付くことはない
([0-9]{1,2}|1[0-8][0-9]|19[01]) # 3桁の数字 : 最大 191 まで
)
> # 最後に > がある";
#endregion
#region タイムスタンプ 正規表現パターン
const string TimeStampRegexPattern = @"
(?<TIMESTAMP> # タイムスタンプを TimeStamp にキャプチャする
(?=[JFMASOND]) # 先頭が月の名前の一部の場合
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) # 月の名前の一致する
\ # スペースが1つ入る
(\ [1-9]|[12][0-9]|3[01]) # 1日から31日まで : 一桁の場合は先頭にスペースがもう1つ付く
\ # スペースが1つ入る
([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9] # 時刻 : 00:00:00 から 23:59:59 まで
)\ # 最後にスペースが1つ入る";
#endregion
#region ホスト名 正規表現パターン
const string HostAddressPattern = @"
(?<HOST> # ホスト名を Host にキャプチャする
(?=[a-zA-Z0-9:]) # 先頭がホスト名に使える文字/数字/IPv6省略記号:の場合
( # ホスト名/IPv4アドレス/IPv6アドレスのいずれかをマッチ
([a-zA-z][-a-zA-Z0-9]{0,62}) # ホスト名: 先頭は英文字で以降は英数字/63文字以下
|
(22[0-3]|2[01][0-9]|10[0-9]|1?[0-9][0-9]|[1-9]) # IPv4アドレス: クラスC(223.*)以下とマッチ
( # 先頭が0の場合はマッチしない
\. # .で区切られる
(25[0-5]|2[0-4][0-9]|10[0-9]|1?[1-9][0-9]|[1-9]) # 1から255の間の数値が
){3} # 3回繰り返される
|
([:.a-fA-F0-9]{2,39}) # IPv6アドレス: 簡易マッチ/すべてにマッチする
)
)\ # 最後にスペースが1つ入る";
#endregion
#region メッセージ本体 正規表現パターン
const string MessagePattern = @"
(?>
(?>MSG< # メッセージ部分を MSG にキャプチャする
\P{Cn}* # 未割り当てコード以外のすべてとマッチする
)
)\z # 文字列の末尾までマッチする
";
#endregion
#region Syslogパケット 正規表現パターン
const string SyslogPattern = @"
(?>
( # 有効なPRIヘッダがない場合もある" +
PriorityRegexPattern + @"
(?>
( # 有効なタイムスタンプがない場合もある" +
TimeStampRegexPattern + @"
( # 有効なホスト名がない場合もある" +
HostAddressPattern + @"
)?
)?
)
)?
)" + MessagePattern + @" # その他すべてをメッセージ部分としてマッチする";
#endregion