2

これを含む文字列があります:

@[User::RootPath]+"Dim_MyPackage10.dtsx"
[User::RootPath]正規表現を使用してその部分を抽出する必要があります。これまでのところ、私はこの正規表現を持っています:
[a-zA-Z0-9]*\.dtsx
しかし、さらに先に進む方法がわかりません。

4

5 に答える 5

1

変数については、セット以外のすべてを抽出するためにnot セット を使用して、必要なものを消費してみませんか?[^ ]

^中かっこ内の は、一致しないものを見つけることを意味します。たとえば、a または引用符 ( ) ではないものをすべて探し]ます"

次に、実際の一致を名前付きキャプチャ グループに配置し(?<{NameHere}> )、それに応じて抽出できます。

string pattern = @"(?:@\[)(?<Path>[^\]]+)(?:\]\+\"")(?<File>[^\""]+)(?:"")";
// Pattern is (?:@\[)(?<Path>[^\]]+)(?:\]\+\")(?<File>[^\"]+)(?:")
// w/o the "'s escapes for the C# parser

string text = @"@[User::RootPath]+""Dim_MyPackage10.dtsx""";    

var result = Regex.Match(text, pattern);

Console.WriteLine ("Path: {0}{1}File: {2}",
    result.Groups["Path"].Value,
    Environment.NewLine,
    result.Groups["File"].Value
);

/* Outputs
Path: User::RootPath
File: Dim_MyPackage10.dtsx
*/

(?: )これは、これらをパターンのデファクト アンカーとして使用し、マッチ キャプチャ グループに配置しないためです。

于 2012-11-19T22:06:10.357 に答える
0

次の正規表現パターンを使用します。

\[[^[\]]*\]

このデモを確認してください。

于 2012-11-19T21:42:45.840 に答える
0

回答とコメント、そしてこれまでに「受け入れられた」ものがないという事実から、質問/問題が完全に明確ではないように思えます。'SomeVariable' のみが変数である [User::SomeVariable] パターンを探している場合は、次のことを試してください。

\[User::\w+]

完全な表現をキャプチャします。さらに、そのパターンを検出したいが、「SomeVariable」部分だけが必要な場合は、次を試してください。

(?<=\[User::)\w+(?=])

これはルックアラウンドを使用します。

于 2012-11-19T21:52:48.633 に答える
0

正規表現は、任意の数の英数字の後に.dtsx. あなたの例では、一致しMyPackage10.dtsxます。

一致させたい場合Dim_MyPackage10.dtsxは、正規表現で許可されている文字のリストにアンダースコアを追加する必要があります。[a-zA-Z0-9]*.dtsx

に一致させたい場合は[User::RootPath]、最後で停止する正規表現が必要です/(または\は、パスで使用するスラッシュの種類によって異なります): 次のようなもの: .*\/(または.*\\)

于 2012-11-19T21:03:26.293 に答える
0

ここだ兄貴

using System;
using System.Text.RegularExpressions;
namespace myapp
{
  class Class1
    {
      static void Main(string[] args)
        {
          String sourcestring = "source string to match with pattern";
          Regex re = new Regex(@"\[\S+\]");
          MatchCollection mc = re.Matches(sourcestring);
          int mIdx=0;
          foreach (Match m in mc)
           {
            for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
              {
                Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
              }
            mIdx++;
          }
        }
    }
}
于 2012-11-19T22:06:45.443 に答える