2017-10-03 14 views
1

powershellを使用して文字列から部分文字列を取得しようとしています。私はある値を正規表現\=%7B([^%]+)\%を使用してPowerShell Regexは2文字列の部分文字列を取得します

"=%7BABCDEFGHIJKLM%""=%7BNOPQRSTUVWXYZ%"

ではなく、を得ることができた「=%の7B」と「%」

my string = "onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%" 

の間の文字列を取得したいです2つの弦の内側。これはどうですか?

おかげ

+0

Powersehll!= Powershell – karlphillip

答えて

0

は、あなたが接近しているように...私はあなたが問題を再現するために完全に動作するコードを投稿していなかったので、あなたが投稿した内容に基づいて推測していルックス...

私は後にISEでこれを実行しましたregex101.comであなたの正規表現を検証しています。彼らはあなたのPowerShellの問題など、より技術的になり、特にとして、私のために働いた

$str="onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%" 
$ret = [Regex]::Matches($str, "\=%7B([^%]+)\%") 
$ret.Count 
$ret[0].Groups[1].Value 
$ret[1].Groups[1].Value 

...将来的に

注意、ご質問への回答の改善のための適切な構文を持つ郵便番号...は間違いないでしょうになる。

1

regex lookaroundとかなり簡単:

(?<=\=%7)[A-Z]+(?=%) 

online上でそれを試してみてください。

あなたが途中でさらにオープンにパターンを使用している場合は、ungreedyフラグを追加する必要があります

(?<=\=%7).+?(?=%) 

はこのようにそれを使用します。

$str="onething=%7BABCDEFGHIJKLM%something=%7BNOPQRSTUVWXYZ%" 
$ret = [Regex]::Matches($str, "(?<=\=%7).+?(?=%)") 
for($i = 0; $i -lt $ret.Count; $i++) { 
    $ret[0].Value 
} 

あなたはので、キャプチャグループを使用する必要はありません私のパターンは完全一致を与える。


説明:

正の後方参照は(?<=%7) アサート正規表現は、文字と一致していることを、文字通り%7(大文字と小文字を区別)

マッチ[A-Z]+
+数量詞下記のリストに存在する単一の文字 - 可能な限り1回と無制限の時間で一致し、必要に応じて返す(欲張り)
A〜Zの範囲の1文字(ケースセンsitive)試合以下の正規表現があること

肯定先読み(?=%)
アサート:文字通り

グローバルパターンフラグ文字%と一致する グラム修飾子:グローバル。すべての試合(最初の試合後に復帰しない)
U修飾語:Ungreedy。マッチはデフォルトでは怠惰になります。今?量指定子に続いて貪欲にする

+0

いい投稿!私は最後の数日間、正規表現のルックアライメントを探してきました。 Regexを一般的に使い始めるには、以下のソースをお勧めします:https://github.com/zeeshanu/learn-REGEX – Snak3d0c

関連する問題