2

我有一个包含这个的字符串:

@[User::RootPath]+"Dim_MyPackage10.dtsx"
我需要[User::RootPath]使用正则表达式提取部分。到目前为止,我有这个正则表达式:
[a-zA-Z0-9]*\.dtsx
但我不知道如何进一步进行。

4

5 回答 5

1

对于变量,为什么不使用not set [^ ]来提取集合之外的所有内容来消耗所需的内容?

^括号中的 表示查找匹配的内容,例如它寻找所有不是 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

您的正则表达式将匹配任意数量的字母数字字符,后跟.dtsx. 在您的示例中,它将匹配MyPackage10.dtsx.

如果要匹配Dim_MyPackage10.dtsx,则需要在正则表达式中允许的字符列表中添加下划线:[a-zA-Z0-9]*.dtsx

如果要匹配[User::RootPath],则需要一个将在最后停止的正则表达式/(或\,取决于您在路径中使用的斜杠类型):如下所示:(.*\/.*\\

于 2012-11-19T21:03:26.293 回答
0

使用这个正则表达式模式:

\[[^[\]]*\]

检查这个演示

于 2012-11-19T21:42:45.840 回答
0

从答案和评论 - 以及到目前为止没有人“接受”的事实 - 在我看来,问题/问题并不完全清楚。如果您正在寻找只有 'SomeVariable' 是变量的模式 [User::SomeVariable],那么您可以尝试:

\[User::\w+]

捕捉完整的表达。此外,如果您希望检测该模式,但只需要“SomeVariable”部分,您可以尝试:

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

它使用环视。

于 2012-11-19T21:52:48.633 回答
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 回答