我已經創建并測驗了這個 Regexpattern <\w\w:Value> SYMBOL: (P.*)=(.*)\/\/(.*)
Regex regexPattern = new Regex(@"<\w\w:Value> SYMBOL: (P.*)=(.*)\/\/(.*)");
var attributeChecker = regexPattern.Match(line);
var attributeLongDescription = attributeChecker.Groups[3].ToString().Trim();
這是模型:
<AC:Value> SYMBOL: PDWFNA = 0; // Projektierung D-Weg Freimeldung nicht
// auswerten
<AC:Value> SYMBOL: PDWLE = 0; // L?nge des Durchrutschweges
我從第三組得到的結果是:
Projektierung D-Weg Freimeldung nicht
L?nge des Durchrutschweges
我怎樣才能從第三組得到這些結果:
Projektierung D-Weg Freimeldung nicht auswerten
L?nge des Durchrutschweges
uj5u.com熱心網友回復:
您不能將字串的不相交部分捕獲到單個捕獲組中。您需要匹配模式匹配下方的所有行,這些行是評論的延續,然后對結果進行后處理。
您可以使用以下方法(請參閱C# 演示):
var text = @"<AC:Value> SYMBOL: PDWFNA = 0; // Projektierung D-Weg Freimeldung nicht
// auswerten
<AC:Value> SYMBOL: PDWLE = 0; // L?nge des Durchrutschweges";
var matches = Regex.Matches(text, @"<\w{2}:Value> SYMBOL: (P.*)=(.*)//(.*(?:\n[\s-[\r\n]]*//.*)*)");
foreach (Match m in matches)
{
Console.WriteLine("--- A new match ---");
Console.WriteLine($"Group 1: {m.Groups[1].Value}");
Console.WriteLine($"Group 2: {m.Groups[2].Value}");
Console.WriteLine("Group 3: {0}",
string.Join(" ",
m.Groups[3].Value.Split(new[] {"//"}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim())
)
);
}
輸出:
--- A new match ---
Group 1: PDWFNA
Group 2: 0;
Group 3: Projektierung D-Weg Freimeldung nicht auswerten
--- A new match ---
Group 1: PDWLE
Group 2: 0;
Group 3: L?nge des Durchrutschweges
另請參閱正則運算式演示。
該(.*(?:\n[\s-[\r\n]]*//.*)*)部分將當前行的其余部分捕獲到組 3 中.*,然后是任何零個或多個行,這些行可以以零個或多個空格開頭,除了 CR 和 LF 之外,然后有//,然后是任何直到行尾。
這string.Join(" ", m.Groups[3].Value.Split(new[] {"//"}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()))是后處理第 3 組值的一種方式。在這里,它用//子字串分割,然后所有結果項從前導/尾隨空格中剝離,然后將它們連接成一個帶空格的字串。
你也可以用Regex.Replace(m.Groups[3].Value, @"\s*//\s*", " ")它來縮短它。
uj5u.com熱心網友回復:
匹配后,可以處理第 3 組的匹配,去除前導換行符、空格和 //
<\w\w:Value> SYMBOL: (P[^=\n]*)=(.*?)//(.*(?:\n[\p{Zs}\t]*//.*)*)
模式匹配:
<\w\w:Value> SYMBOL:字面匹配(P[^=\n]*)捕獲組 1,匹配P后跟不=或換行符=字面匹配(.*?)捕獲組 2,匹配除換行符以外的任何字符//字面匹配(捕獲組 3.*匹配該行的其余部分(?:非捕獲組\n[\p{Zs}\t]*//.*匹配換行符、可選空格和 // 以及行的其余部分
)*關閉
)關閉第 3 組
.NET 正則運算式演示| C# 演示
例如,替換后只列印第3組:
string pattern = @"<\w\w:Value> SYMBOL: (P[^=\n]*)=(.*?)//(.*(?:\n[\p{Zs}\t]*//.*)*)";
string input = @"<AC:Value> SYMBOL: PDWFNA = 0; // Projektierung D-Weg Freimeldung nicht
// auswerten
<AC:Value> SYMBOL: PDWLE = 0; // L?nge des Durchrutschweges";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine(Regex.Replace(match.Groups[3].Value, @"\r?\n[\p{Zs}\t] //",""));
}
輸出
Projektierung D-Weg Freimeldung nicht auswerten
L?nge des Durchrutschweges
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317067.html
