正则表达式提取变量部分

时间:2012-11-19 20:57:09

标签: c# regex

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

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

5 个答案:

答案 0 :(得分:1)

对于变量,为什么不使用未设置 [^ ]来提取所需内容之外的所有内容?

大括号中的^表示找到匹配的内容,例如,它搜索所有不是]或引用的内容({{1} })。

然后我们可以将实际匹配放在命名捕获组"中并相应地提取

(?<{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 */ 匹配但不捕获,因为我们将它们用作模式的事实锚点,而不是将它们放入匹配捕获组。

答案 1 :(得分:0)

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

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

如果你想匹配[User::RootPath],你需要一个在最后/(或\停止的正则表达式,取决于你在路径中使用哪种类型的斜杠) :类似这样的内容:.*\/(或.*\\

答案 2 :(得分:0)

使用此正则表达式模式:

\[[^[\]]*\]

检查 this demo

答案 3 :(得分:0)

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

\[User::\w+]

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

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

使用环视。

答案 4 :(得分: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++;
          }
        }
    }
}