2016-04-13 11 views
0

PowerShellのメール本体からURLを抽出しようとしています。PowerShellで[Regex] :: Matchを使用すると問題が発生する

私は、次の正規表現を使用しています:メールフォルダに、各メール項目の(this siteで見つかった)

$regexURL = "@^(https?|ftp)://[^\s/$.?#].[^\s]*[email protected]" 

を、私ループ:

foreach ($Mail in $subfolder.items) {  
    $a = [Regex]::Match($Mail.Subject, $regexURL).Groups[1].Value 
    $b = [Regex]::Match($Mail.Body, $regexURL).Groups[1].Value 
} 

しかし、たとえMail.Subjectか本文には有効なURLが含まれています。$ aと$ bは空のままです。

私はマッチ()がどのように動作しているのか分かりませんでした。

Thanxについては、その質問のヘルプをご覧ください。 Jerome

+0

インデント!投稿する前に修正してください! – Druzion

+0

'$ Mail.Subject'の例と' $ a'を期待するものを投稿してください。 –

+1

'@'は何のためのものですか?他の言語の正規表現であると思われます。 '$ regexURL = '(https?ftp):// [^ \ s /$.?#]。[^ \ s] * $''を試してください。 PS/.NET AFAIKでは 'iS'修飾子は必要ありません。 –

答えて

2

正規表現は別の言語(おそらくPHP)用ですので、それを.NET構文に変更する必要があります。 Powershellはデフォルトでは大文字と小文字を区別しません。Sは私が思うほどPHPの最適化修飾子なので、両方をスキップします。試してみてください:

$regexURL = '(https?|ftp)://[^\s/$.?#].[^\s]*$' 

サンプル:

$regexURL = '(https?|ftp)://[^\s/$.?#].[^\s]*$' 

#URL 
[regex]::Match("test http://stackoverflow.com/questions/36604481/issue-using-regexmatch-in-powershell/36605171?noredirect=1#comment60807898_36605171", $regexURL).Groups[0].Value 
http://stackoverflow.com/questions/36604481/issue-using-regexmatch-in-powershell/36605171?noredirect=1#comment60807898_36605171 

#Protocol 
[regex]::Match("test http://stackoverflow.com/questions/36604481/issue-using-regexmatch-in-powershell/36605171?noredirect=1#comment60807898_36605171", $regexURL).Groups[1].Value 
http 
+0

でも、.NETでは修飾子を使用しないので、 '@ ^'は基本的に '(?!)'と同じです。 –

+0

私はあなたがポイントを見つけたと思うが、それはまだ動作していません。私は今、 "(http [s]?| [s]?ftp [s]?)(:\/\ /)([^ \ s、] +)"と試してみて、$ bに "http" 。私はPowerShell 5のために正しいregexUrlを見つけなければなりません。 –

+0

それはまさにそれがすべきことです。あなたはキャプチャグループ '()'に 'http'(プロトコル)を持っています。試合そのものはグループ0です。更新された回答のサンプルを参照してください –

関連する問題