文字列の最後から ID を抽出する必要があるこの文字列があります (IgnoreCase は true):
弦:
[Test].Test Stuff].[Class].&[002 - My Hat]&[002-01 - Big Hat]
抽出したいもの:
002-01
これまでのところ、私が持っているのはこれです:
(?<=&\[).+(?=\s\-\s.+\])
しかし、私はこれを得ています:
002 - My Hat]&[002-01
次のように、入力の終わりのアンカーを最後に追加し、空でないシーケンスの一部としての$
一致を禁止する必要があります。[]
.+
(?<=&\[)([^\[\]]+)(?=\s\-\s[^\[\]]+\]$)
// ^^^^^^^ ^^^^^^^ ^
// | | |
// No square brackets here |
// |
// End of input marker here
より単純なバージョン:
(?<=\]\&\[)(\d+-\d+)
説明:
?<=
肯定的な後読みを行います。これは、() 括弧内の文字に一致するが、それらを返さないことを意味します。私が使用したこの肯定的な後読み内の文字は、]&[
\d+
次に、これは 1 を意味する 1 から無限大の連続する数字に一致し、その後にハイフンが続き-
、再び\d+
また、http://regex101.com/r/iW4cP1で遊んでみます。
文字列の形式が常に同じである場合は、次の]&[
ように正規表現の最後を使用します。
\]&\[([\d-]*).*
数字が常に]&[の後に続く場合は、これでうまくいくはずです。
そうでなければ、私はこのようなものがトリックを行うべきだと思います:
\[([\d-]+)[^\[]*\]$
したがって、[以外の文字が最後まで続く数字のグループ]
文字列の最後にあることがわかっている場合は、そのヒントを使用してプロセッサに通知してみませんか?右から左への正規表現オプションを使用しています。
string data = @"[Test].Test Stuff].[Class].&[002 - My Hat]&[002-01 - Big Hat]";
string pattern = @"(?:\[)(?<Data>\d+-\d+)";
Console.WriteLine(Regex.Match(data, pattern, RegexOptions.RightToLeft).Groups["Data"].Value); // 002-01
あなたの正規表現は実際にはかなり近いです。] ブラケットを追加すると、必要なものと一致するはずです。
(?<=\]&\[).+(?=\s\-\s.+\])
数値形式が常に同じである場合、実際には先読みは必要ありません。代わりに、形式を一致させることができます。
(?<=\]&\[)\d{3}-\d{2}