如何在我的正则表达式条件之前立即获得单词?
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
【讨论】:
以上是关于如何在我的正则表达式条件之前立即获得单词?的主要内容,如果未能解决你的问题,请参考以下文章