Получить 2 переноса строки после ключевого слова - PullRequest
4 голосов
/ 22 марта 2019

Я работаю над кодом, который может сканировать несколько файлов .docx на наличие ключевого слова, а затем выдавать целое предложение до конца строки.

Эта функция прекрасно работает, я получаю каждое предложение, которое содержит ключевое слово, пока не будет разрыв строки.

Мой вопрос:

Как должен выглядеть мой RegEx, когда я не хочу текст до 1-го переноса строки, но текст до 2-го переноса строки?Может с правильным квантификатором?Я не получил его на работу.

Мой шаблон: ".*" + "keyword" + ".*"

Main.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using Xceed.Words.NET;

public class Class1
{

  static void Main(string[] args)
  {
     String searchParam = @".*" + "thiskeyword" + ".*";
     List<String> docs = new List<String>();
     docs.Add(@"C:\Users\itsmemario\Desktop\project\test.docx");

     for (int i = 0; i < docs.Count; i++)
     {
         Suche s1 = new Suche(docs[i], searchParam);
         s1.SearchEngine(docs[i], searchParam);
     }
  }
}

Suche.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
using Xceed.Words.NET;


public class Suche
{
    String path;
    String stringToSearchFor;
    List<String> searchResult = new List<String>();

    public Suche(String path, String stringToSearchFor)
    {
        this.path = path;
        this.stringToSearchFor = stringToSearchFor;
    }

    public void SearchEngine(String path, String stringToSearchFor)
    {
        using (var document = DocX.Load(path))
        {
           searchResult = document.FindUniqueByPattern(stringToSearchFor, RegexOptions.IgnoreCase);

            if (searchResult.Count != 0)
            {
                WriteList(searchResult);
            }
            else
            {
                Console.WriteLine("Text does not contain keyword!");
            }
        }
    }

    public void WriteList(List<String> list)
    {
        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
            Console.WriteLine("\n");
        }
    }
}

Ожидаемый результат равен

"*LINEBREAK* Theres nothing nicer than a working filter for keywords. *LINEBREAK*"

1 Ответ

1 голос
/ 22 марта 2019

Нельзя использовать document.FindUniqueByPattern метод DocX для сопоставления между строками, поскольку он выполняет поиск только в отдельных абзацах. См. этот исходный код , а именно foreach( Paragraph p in Paragraphs ).

Вы можете получить свойство document.Text или объединить все тексты абзацев в один и осуществлять поиск по всему тексту. Удалите строку searchResult = document.FindUniqueByPattern(stringToSearchFor, RegexOptions.IgnoreCase); и используйте

var docString = string.Join("\n", document.Paragraphs.Select(p => p.text));
// var docString = string.Join("\n", document.Paragraphs.SelectMany(p => p.MagicText.Select(x => x.text)));
searchResult = Regex.Matches(docString, $@".*{Regex.Escape(stringToSearchFor)}.*\n.*", RegexOptions.IgnoreCase)
    .Cast<Match>()
    .Select(x => x.Value)
    .ToList();
...