簡體   English   中英

將部分字符串與正則表達式匹配

[英]Matching a partial string with a regular expression

我試圖解析一個堆棧跟蹤的片段,它看起來很像這樣:

at Test.Test1() in C:\Projects\Project\Test.cs:line 37 

使用這樣的正則表達式可以按預期工作:

at (.*?) in (.*?):line (\d*)

這個匹配

  1. Test.Test1()
  2. C:\\ Projects \\ Project \\ Test.cs
  3. 37

此正則表達式被硬編碼為英文的stacktrace,因此如果stacktrace使用另一種語言(例如瑞典語),則顯然沒有匹配項:

vid Test.Test1() i C:\Projects\Project\Test.cs:rad 37

為了使匹配更加語言中立,我嘗試了此正則表達式:

 (.*?) .*? (.*?) (\d*)

這個匹配

  1. Test.Test1()
  2. C:\\ Projects \\ Project \\ Test.cs:line
  3. 37

問題是我如何匹配不帶尾部:line的文件路徑?

您可以嘗試硬編碼在文件名部分中第二個冒號的必要性:

.:[^:]*

在驅動器號后的冒號之后,顯然不能再有其他冒號成為文件名的一部分。 但是,您可能必須處理UNC路徑,因此以下內容可能會解決該問題:

.:?[^:]*

這使得冒號是可選的,以允許使用UNC路徑。

因此,使用以下“:line”捕獲的文件名部分可能看起來像這樣:

(.:?[^:]*):\S+

(。 ?)。 (。 ?):(\\ S +)(\\ d

我假設匹配項之間的空格實際上與正則表達式中的空格匹配。 冒號在所有語言中都可能是常數,因此您只需要在冒號后匹配非空白字符

編輯:

玩了一下,想出了這個:

.+?\s+(\S+)\s+.+?\s+(.*):(\S*)\s(\d+)

對於

at Test.Test1() in C:\Projects\Project Folder\Test.cs:rad 37

路上的冒號把我扔了一秒鍾。 但這應該有

$ 1中的Test.Test1()C:\\ Projects \\ Projects Folder \\ Test.cs $ 2中的rad中$ 3中的$ 37中$ 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM