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必要な長さのプレースホルダー文字列を作成する場所。

その後、無視する単語とすべての注釈を検索できます

于 2013-02-28T17:35:12.377 に答える
0

この状況では、正規表現はあなたの味方ではないのだろうか。特に、可能な限り高速なアルゴリズムが必要な場合は、これをステート マシンとして実装する必要があります。

本質的には、一度に 1 文字ずつ文字列をリッピングし、一致する注釈区切り文字のスタックを保持します。注釈の中にいない限り、一致させようとしている文字列にも注意してください。

質問の明確化: 検索しているテキストが固定リテラルであると想定できますか? 空白の量を気にしますか? 「注釈」の問題を解消すれば、残りの検索を行うために RegExes のすべての機能を必要としない可能性があるためです。

于 2013-02-28T18:14:36.193 に答える