[英]Regex IsMatch stops matching
我正在用 Regex 編寫一個檢查器,我正在使用一種流行的工具測試結果: https://regex101.com/r/DeMWEy/1
我有一個應該匹配的字符串列表:
Process(Bystronic.Ads.GraphQL)\% Processor Time
Process(Bystronic.ParameterTuning.WebApi.Service)\\% Processor Time
Process(Bystronic.Ads.GraphQL)\\IO Write Bytes/sec
Process(DcCutting)\\IO Read Bytes/sec
Process(DcCutting)\\% Processor Time
還有一個應該匹配所有這些的正則表達式。
"Process(.+)\\.+"
這是一個 MVC:
using System.Text.RegularExpressions;
public class MainClass
{
private static bool IsProcessMatch(string column)
{
return Regex.IsMatch(column, "Process(.+)\\.+");
}
public static void Main()
{
var result1 = IsProcessMatch("Process(Bystronic.Ads.GraphQL)\\% Processor Time");
var result2 = IsProcessMatch("Process(Bystronic.ParameterTuning.WebApi.Service)\\% Processor Time");
var result3 = IsProcessMatch("Process(Bystronic.Ads.GraphQL)\\IO Write Bytes/sec");
var result4 = IsProcessMatch("Process(DcCutting)\\IO Read Bytes/sec");
var result5 = IsProcessMatch("Process(DcCutting)\\% Processor Time");
Console.WriteLine(result1);
Console.WriteLine(result2);
Console.WriteLine(result3);
Console.WriteLine(result4);
Console.WriteLine(result5);
}
}
我在第一個和第二個中匹配,但在 rest 中沒有匹配。有人可以向我解釋它們之間的區別嗎?
C# 對待模式與您發布的使用正則表達式引擎的頁面略有不同。 在左側有一個菜單,您可以在其中選擇口味。 如果您選擇 C#,您將看到:
缺少一個小細節: @
在您的代碼中。 該頁面將為您添加它
private bool IsProcessColumn(string column)
{
return Regex.IsMatch(column, @"Process(.+)\\.+");
}
這是一個用於測試的小提琴
解釋:問題是字符\
是一個特殊字符,在正則表達式的上下文中也是不明確的。
\d
(數字),並標記真實字符,如: \.
(匹配一個真實的點) 因此,如果沒有@
,該模式將被解釋為尋找一個點,因為第一個反斜杠是一個轉義字符,它使第二個反斜杠成為應用於該點的正則表達式的修飾符: \.
. 您可以通過在最后一個字符串中插入一個點來測試它:
string a5 = "Process(DcCutting)\\%. Processor Time";
並且您將與您的原始模式相匹配。
使用@
(這意味着您不需要轉義特殊字符)導致第一個反斜杠已被視為正則表達式的修飾符,然后將其應用於第二個反斜杠: \\
試圖匹配中的真實反斜杠字符串,和.
然后被解釋為通配符。
聽起來非常復雜。 我希望我至少有一點可以理解
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.