2

我有一个带有一些注释标记的文本。方括号“(”和“)”或“[”和“]”用于确定注释的一部分(就像在普通文本中一样,就像这句话一样)。我想对其执行正则表达式以搜索输入中的某些内容,但是...它应该忽略所有注释。

问题是:

  • 它们可以出现在任何地方(我不知道在哪里以及有多少)
  • 我不能轻易剥离它们(执行替换正则表达式来杀死所有出现),因为在原始文本中执行我的搜索正则表达式后我需要知道索引和长度
  • 它必须在巨大的输入文本上尽可能快

注释不能嵌套,不会出现“123(Hello(World))”之类的东西。如果注释括号是字符串的一部分(在引号中),它们是文本的一部分,因此没有注释。

这是一个例子:

Input Text: "Hello, my (real) name is John. I worked in England (near London) on a real german restaurant.".

Search Regex: "my.*?real"

Output: "my (real) name is John. I worked in England (near London) on a real" (index=7, length=67)

解决这个问题的最佳方法是什么?

4

4 回答 4

0

您可以使用

my.*?real(?![^(\[]*[\)\]])
于 2013-02-28T17:24:41.477 回答
0

试试下面的代码它可能是我们

  public string output { get; set; }

  string input="Hello, my [FirstName] name is John. I worked in England [nearLondon] on a real german restaurant.".
  static readonly Regex re = new Regex(@"\{([^\}]+)\}", RegexOptions.Compiled);

  StringDictionary fields = new StringDictionary();
  fields.Add("FirstName", yourname);
  fields.Add("nearLondon", yournearLondon);

  output = re.Replace(input, delegate(Match match)
        {
            return fields[match.Groups[1].Value];
        });
于 2013-02-28T17:25:22.827 回答
0
  string source =
            @"Hello, my (real) name is John. I worked in England (near London) on a real  german restaurant.";

        Regex regex=new Regex(@"\(.*?\)");

        MatchCollection matchCollection= regex.Matches(source);

        foreach (Match match in matchCollection)
        {
            source = source.Replace(match.Groups[0].Value, GetPlaceholderString(match.Groups[0].Length));
        }
        MessageBox.Show(source);

在哪里GetPlaceholderString制作所需长度的 plactholder 字符串。

之后,您可以搜索您的单词忽略和所有注释

于 2013-02-28T17:35:12.377 回答
0

我想知道 RegEx 在这种情况下是否不是你的朋友。特别是因为您想要尽可能快的算法,也许您应该将其实现为状态机。

本质上,一次翻开字符串一个字符,并保留一堆匹配的注释分隔符。只要您不在注释中,也要注意您尝试匹配的字符串。

澄清问题:您是否能够假设您正在搜索的文本是固定文字?你关心空格的数量吗?我问是因为,一旦您消除了“注释”问题,您可能不需要 RegExes 的所有功能来完成其余的搜索。

于 2013-02-28T18:14:36.193 回答