[英]Regex Failing “Unrecognized Escape sequence”
module107
應該與示例文本Module ID="107"
相匹配
您可以幫助我了解代碼中的錯誤之處嗎?
var module107 = Regex("\A*Module\sID=\"107\"");
錯誤:無法識別的轉義序列
這里的問題是,您想逃避兩個不同的級別。 \\A
是正則表達式的轉義序列。 但是問題是,首先有一個試圖解釋轉義序列的字符串,並且該字符串不知道轉義序列\\A
或\\s
(我不知道)。
可能有兩種解決方案:
如果要轉義正則表達式,請將\\
翻倍。 所以
var module107 = Regex("\\\\A*Module\\\\sID=\\"107\\"");
是字符串,並且在處理完字符串后,正則表達式為\\A*Module\\sID="107"
使用逐字字符串。 如果在字符串之前添加@
,則字符串不會評估轉義序列。 因此Regex(@"\\A*Module\\sID=")
將以regex \\A*Module\\sID=
但是現在您在正則表達式中想要使用"
遇到了問題。您可以通過將其加倍來在逐字字符串中添加"
:
var module107 = Regex(@"\\A*Module\\sID=""107""");
這將匹配模塊id =“ 107”,其中數字是用雙引號引起來的任意數量的數字。 我用[""]
更改了轉義的引號,以便可以將它們嵌套到字符串中。 我正在使用\\b
,它將查找單詞break並允許字符串出現在輸入中的任何位置。 但是,如果要驗證特定的文本,則可以使用\\A
或^
來表示字符串的開頭。
\\b(Module\\s+ID=[""](\\d{1,})[""])
組0將捕獲整個字符串
using System;
using System.Text.RegularExpressions;
namespace myapp
{
class Class1
{
static void Main(string[] args)
{
String sourcestring = "for Module ID=""107"" Can you h";
Regex re = new Regex(@"\b(Module\s+ID=[""](\d{1,})[""])",RegexOptions.IgnoreCase);
MatchCollection mc = re.Matches(sourcestring);
int mIdx=0;
foreach (Match m in mc)
{
for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
{
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
}
mIdx++;
}
}
}
}
$matches Array:
(
[0] => Array
(
[0] => Module ID="107"
)
[1] => Array
(
[0] => Module ID="107"
)
[2] => Array
(
[0] => 107
)
)
關鍵是要先將您鍵入的文本解釋為字符串,然后再解釋為正則表達式。 字符串解釋還會查看'\\',並在其解釋中使用它們。
正如Tyanna所說,這意味着您需要轉義那些“ \\”,以免在讀取字符串或混淆字符串解析器時它們不會被“用完”。
您可能想嘗試的另一種方法是使用字符串文字。 使用Regexes時,這可能會更干凈一些,因為您不會以很多斜杠結尾(有時只用雙引號引起來):
var module107 = new Regex(@"\A*Module\sID=""107""");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.