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 作为richtextbox)

    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(text);

于 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 回答