如何在我的正则表达式条件之前立即获得单词?

Posted

技术标签:

【中文标题】如何在我的正则表达式条件之前立即获得单词?【英文标题】:How do I get the words immediately before my regex condition? 【发布时间】:2021-11-07 00:16:57 【问题描述】:

RegEx 帮助我在堆栈跟踪中找到 :line

\W*(:line)\W*

我正在编写代码以帮助在 html 中发生崩溃时突出显示文件和行号

示例堆栈跟踪

Microsoft.Data.SqlClient.SqlException (0x80131904): The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at Microsoft.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows) at Microsoft.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more) at Microsoft.Data.SqlClient.SqlDataReader.<>c__DisplayClass196_0.<ReadAsync>b__1(Task t) at Microsoft.Data.SqlClient.SqlDataReader.InvokeRetryable[T](Func`2 moreFunc, TaskCompletionSource`1 source, IDisposable objectToDispose) --- End of stack trace from previous location where exception was thrown --- at ExampleProjectSystem.API.Services.ReportRepository.SearchCustomerByAdvanceFilters(TableBaseDto filter, String ReportName) in E:\SharedProjects\ExampleProjectAPI\Services\ReportRepository.cs:line 445

我只想要 ReportRepository.cs:line 445,这样我就可以在查看崩溃时更改 HTML 中的字体/颜色/css。

【问题讨论】:

您想要捕获反斜杠和文本:line 之间的所有内容,加上后面的数字,所以([^\\]+:line \d+)。 regex101.com/r/wTkppa/1 【参考方案1】:

\w+\.\w+:line\s\d+(看看这个:https://regexr.com/65d2l)

解释:

第一个 \w+ 匹配 ReportRepository\. 转义点并匹配它。 \w+ 匹配 cs:line\s 匹配 :line \d+ 匹配 445。

【讨论】:

【参考方案2】:

你可以使用

([^\s\\]+):line\s+(\d+)

请参阅.NET regex demo。输出:

详情

([^\s\\]+) - 捕获组 1:除空格和 \ 之外的一个或多个字符 :line - 文字文本 \s+ - 一个或多个空格 (\d+) - 第 2 组:一位或多位数字。

见C# demo:

var text = @"ExampleProjectSystem.API.Services.ReportRepository.SearchCustomerByAdvanceFilters(TableBaseDto filter, String ReportName) in E:\SharedProjects\ExampleProjectAPI\Services\ReportRepository.cs:line 445";
var pattern = @"([^\s\\]+):line\s+(\d+)";
var result = Regex.Match(text, pattern);
if (result.Success) 

    Console.WriteLine(result.Groups[1].Value); // => ReportRepository.cs
    Console.WriteLine(result.Groups[2].Value); // => 445

【讨论】:

以上是关于如何在我的正则表达式条件之前立即获得单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何否定正则表达式中的特定单词? [复制]

提取单词和单词之前,并在正则表达式中的“_”之间插入

如何在r中使用正则表达式删除单词之前的所有措辞?

用于 unicode 大写单词的 Python 正则表达式

此正则表达式方言不支持条件

正则表达式在字符串中任何特定单词之前和之后查找特定单词