var str = "=IIF(IsNothing(Fields!Metadata1.Value),"N/A",Fields!Metadata1.Value)";
var regexp = new Regex(@"Fields!(\w+)");
var matches = regexp.Matches(str);
「Metadata1」を取得する必要がある間、試合には「Fields!Metadata1」が含まれます
何を変えましょうか?
必要なものは、後読み/後読みと呼ばれます。正規表現にはこの機能があり、現在一致している文字列の後に続く (この場合は前にある) ものを指定できます。
[0-9](?=[a-z])
任意の 1 桁の後に小文字が続くものと一致します。
[0-9](?![a-z])
小文字が続かない任意の 1 桁に一致します。(これは否定先読みと呼ばれます)
(?<=[a-z])[0-9]
は、小文字が前にある任意の 1 桁に一致します。
(?<![a-z])[0-9]
小文字が前にない任意の 1 桁に一致します (これは負の後読みと呼ばれます)。
それを念頭に置いて、必要な c# 式は次のとおりです。
var str = "=IIF(IsNothing(Fields!Metadata1.Value),"N/A",Fields!Metadata1.Value)";
var regexp = new Regex(@"(?<=Fields!)(\w+)");
var matches = regexp.Matches(str);
編集:「フィールド」に一致させたくない場合、これはあなたにとって良いことです! 部。少し異なるタスクは、一致させたい場合ですが、2 番目の部分の値も必要です。その場合、すべてをキャプチャする名前付きグループを使用することをお勧めしますが、その一部は Groups コレクションから取得できます。その場合の正規表現は次のようFields!(?'fieldName'\w+)
になり、C# の使用法は次のようになります。
var str = "=IIF(IsNothing(Fields!Metadata1.Value),"N/A",Fields!Metadata1.Value)";
var regexp = new Regex(@"Fields!(?'fieldName'\w+)");
var matches = regexp.Matches(str);
foreach (Match m in matches)
{
var fieldName = m.Groups["fieldName"].Value;
//...
}
c#構文がわからない、正規表現の場合は、次を試してください。
(?<=Fields!)\w*
編集短い説明を追加します:
(?<=foo)bar
次のbar
場合にのみ 一致します(fooは一致結果に含まれません)が前向きで、幅がゼロのアサーションです。詳細についてはグーグルで検索してください。bar
foo
(?<=..)
多分あなたはこれを試すことができます...
var match = Regex.Match(item, @"!(\w+)");
次に、match.Groups[1].Value を取得します。