我有以下字串,我正在嘗試對其執行正則運算式:
040A0000 02CCDAD0 F9401401
040A0000 02CCDAD4 F8410021
040A0000 02CCDAD8 B4000041
040A0000 02CCDADC 52800015
040A0000 02CCDAE0 2A1503E1
040A0000 02CCDAE4 17DA29B5
我的目標是檢索最后一個 8 個字符塊,不管它之前有多少個字符。我正在使用以下模式:
^(([\d\w] ){1,})?([\d\w] )$
現在,根據 regex101,這種模式應該可以正常作業:https ://regex101.com/r/ZuWIPV/1
但是,當運行以下代碼時:
var reg = new Regex("^(([\\d\\w] ){1,})?([\\d\\w] )$", RegexOptions.Multiline);
if (reg.IsMatch(textBox1.Text))
{
var instructions = reg.Matches(textBox1.Text).Cast<Match>().Select(x => x.Groups[3].Value).ToArray();
foreach (var instruction in instructions)
{
MessageBox.Show(instruction);
}
}
我得到的唯一結果來自最后一行:
17DA29B5
我期待得到所有 6,像這樣:
F9401401
F8410021
B4000041
52800015
2A1503E1
17DA29B5
uj5u.com熱心網友回復:
首先,您不需要使用[\w\d]as\w也匹配數字。接下來,當您在 C# 中定義正則運算式時,您應該使用逐字字串文字以避免過度轉義。此外,僅當您需要保存一些性能時才使用捕獲組。
問題是您忘記在每行末尾匹配一個可選的 CR 字符。請參閱多行模式MSDN 正則運算式參考
默認情況下,
$僅匹配輸入字串的結尾。如果您指定RegexOptions.Multiline選項,它將匹配換行符 (\n) 或輸入字串的結尾。但是,它不匹配回車/換行字符組合。要成功匹配它們,請使用子運算式\r?$而不僅僅是$.
您可以使用
var reg = new Regex(@"^(?:\w )*(\w )\r?$", RegexOptions.Multiline);
要支持一行中的任何空格,您可以使用
var reg = new Regex(@"^(?:\w [\p{Zs}\t])*(\w )\r?$", RegexOptions.Multiline);
where[\p{Zs}\t]匹配任何水平空白。
如果您只想匹配每行末尾的最后 8 個 ASCII 十六進制字符,您可以使用
var reg = new Regex(@"[a-fA-F0-9]{8}\r?$", RegexOptions.Multiline);
.NET\w中的Note匹配所有Unicode字母、數字、連接符標點甚至變音符號,因此在這種情況下它可能不是最好的選擇。唉,.NET regex 沒有十六進制字符的簡寫,如%xLua、[[:xdigit:]]POSIX BRE/ERE、\p{XDigit}Java 等。
為什么 regex101.com 顯示正確匹配?
在 regex101.com,所有的換行符都只有 LF,但在 C# 中,在 Windows 上,換行符大多是 CRLF。但是,$在多行匹配中只在 LF 字符之前。
當您需要測驗 .NET 正則運算式時,使用 regex101.com 來驗證模式并不是一個好主意,因為此正則運算式測驗站點不支持 .NET 正則運算式語法(和 Linux 行尾)。您可以使用RegexStorm.net,其中換行符設定為 CRLF。
uj5u.com熱心網友回復:
如果您看到有關多行模式的檔案,它會包含以下內容:
默認情況下,$ 僅匹配輸入字串的結尾。如果您指定 RegexOptions.Multiline 選項,它將匹配換行符 (\n) 或輸入字串的結尾。但是,它不匹配回車/換行字符組合。要成功匹配它們,請使用子運算式 \r?$ 而不是 $。
您的文本框將\r\n用于換行。這如您在 .net 上所期望的那樣作業:
string Text = "040A0000 02CCDAD0 F9401401\n040A0000 02CCDAD4 F8410021\n040A0000 02CCDAD8 B4000041\n040A0000 02CCDADC 52800015\n040A0000 02CCDAE0 2A1503E1\n040A0000 02CCDAE4 17DA29B5\n";
//the regex can be simpler if you just want the last hex chars of a line
var reg = new Regex("([A-F0-9]{8})$", RegexOptions.Multiline);
var rr = reg.Matches(Text); //6 matches
我要指出的是,如果這些資料將具有這種常規表示形式,那么它甚至不需要正則運算式。
textbox.Lines.Select(line => line[^8..])
還會從每一行中檢索最后 8 個字符,盡管它不會驗證它們是否為十六進制(如果這很重要)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377520.html
上一篇:正則運算式匹配選項卡
