6
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」が含まれます

何を変えましょうか?

4

3 に答える 3

10

必要なものは、後読み/後読みと呼ばれます。正規表現にはこの機能があり、現在一致している文字列の後に続く (この場合は前にある) ものを指定できます。

[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;
   //...
}
于 2013-02-22T13:54:06.260 に答える
9

c#構文がわからない、正規表現の場合は、次を試してください。

(?<=Fields!)\w*

編集短い説明を追加します:

(?<=foo)bar次のbar場合にのみ 一致します(fooは一致結果に含まれません)が前向きで、幅がゼロのアサーションです。詳細についてはグーグルで検索してください。barfoo(?<=..)

于 2013-02-22T13:43:28.640 に答える
2

多分あなたはこれを試すことができます...

var match = Regex.Match(item, @"!(\w+)");

次に、match.Groups[1].Value を取得します。

于 2013-02-22T13:49:22.140 に答える