using System.Text.RegularExpressions;
using Dpz.Core.Service.Mediator.Features.Article.Contracts;
namespace Dpz.Core.Service.Mediator.Features.Search.Queries;
/// <summary>
/// 对指定文本执行正则匹配并返回命中明细。
/// </summary>
public class ContentSearchEvent : IRequestHandler<ContentSearchRequest, List<SearchResult>>
{
/// <summary>
/// 按行扫描文本并收集匹配结果。
/// </summary>
public async ValueTask<List<SearchResult>> Handle(
ContentSearchRequest request,
CancellationToken cancellationToken
)
{
var searchResults = new List<SearchResult>();
if (string.IsNullOrWhiteSpace(request.Pattern) || string.IsNullOrWhiteSpace(request.Text))
{
return searchResults;
}
var regex = new Regex(request.Pattern, RegexOptions.IgnoreCase);
using var textReader = new StringReader(request.Text);
var currentLineNumber = 0;
while (await textReader.ReadLineAsync(cancellationToken) is { } line)
{
var matches = regex.Matches(line);
foreach (Match match in matches)
{
var result = new SearchResult
{
LineNumber = currentLineNumber + 1,
StartIndex = match.Index,
EndIndex = match.Index + match.Length - 1,
MatchedText = match.Value,
};
searchResults.Add(result);
}
currentLineNumber++;
}
return searchResults;
}
}
评论加载中...