2

問題はこれです:

テキストファイルで正規表現を見つけて、テキストの完全なブロックを取得したい

テキストの例:

text text text text text text text text text 
!
title
text text text text text text text text text text text text text text text 
text text text text text text text text text text text text text text text 
text text text text text text text text text text text text text text text 
!
text text text text text text text text text 

「タイトル」部分を見つけるのは簡単ですが、次の結果を得たいです:

title
text text text text text text text text text text text text text text text 
text text text text text text text text text text text text text text text 
text text text text text text text text text text text text text text text 

最善の方法は何ですか?正規表現パターンを操作したり、「!」が表示されるまでテキストを選択したりしますか? (シンプルで速く読めるコードが欲しい)

パターンを見つけるためのコード: (リッチテキスト ボックスとして rtxtText を使用)

    private String searchInfo(String pattern)
    {
        String text = rtxtText.Text;
        Regex regExp = new Regex(pattern);
        String result = "";

        foreach (Match match in regExp.Matches(text))
        {
            result += "\n" + match.ToString();
        }
        return result; 
    }
4

3 に答える 3

4

あなたの正規表現は、次のような未知の文字も含むように変更されます

  • 最初title
  • 次に[^!]*([^ ]このセットにない何かを意味するので、任意の数[^!]*以外!のすべてを意味します)

    正規表現 regex = new Regex("title[^!]*", RegexOptions.SingleLine); MatcheCollection マッチ = regex.Matches(テキスト);

于 2012-04-19T09:29:29.853 に答える
1

最善の方法は、最初の '!' が見つかるまでテキスト行をループすることです。次を見つけるまで収集します。

line = textfile.readline()
while line and line.strip() != '!'
    line = textfile.readline() # skip until first '!'
title = textfile.readline() # now on title line
text = ''
line = textfile.readline()
while line and line.strip() != '!'
    text += line
    line = textfile.readline()
print title
print text
于 2012-04-19T09:34:08.313 に答える
1
public IEnumerable<string> ParseParagraphs(string text)
{
    Regex regex = new Regex(@"title[^!]*");
    foreach (Match match in regex.Matches(text))
        yield return match.Value;  
}

使い方は簡単です:

foreach (var p in ParseParagraphs(your_text))
    Console.WriteLine(p);

更新: SearchInfo メソッドで StringBuilder を使用して、メモリ内に多くの文字列を作成しないようにします。

private string SearchInfo(String pattern)
{            
    MatchCollection matches = Regex.Matches(rtxtText.Text, pattern);
    if (matches.Count == 0)
        return String.Empty;

    StringBuilder sb = new StringBuilder();
    foreach (Match match in matches)
        sb.AppendLine(match.Value);

    return sb.ToString();
}

そして、このように呼びますvar result = SearchInfo(@"title[^!]*");

于 2012-04-19T09:34:59.867 に答える