module107
应与示例文本Module ID="107"
你能帮我理解我在代码中出错的地方吗?
var module107 = Regex("\A*Module\sID=\"107\"");
错误:无法识别的转义序列
答案 0 :(得分:4)
这里的问题是,你想要逃脱两个不同的级别。 \A
是正则表达式的转义序列。但问题是,首先是字符串试图解释转义序列,字符串不知道转义序列\A
或\s
(我不知道)。
可能有两种解决方案:
如果您正在逃避正则表达式,请将\
加倍。所以
var module107 = Regex("\\A*Module\\sID=\"107\"");
是字符串,处理完字符串后,正则表达式为\A*Module\sID="107"
使用逐字字符串。如果在字符串之前添加@
,则字符串不会计算转义序列。因此,Regex(@"\A*Module\sID=")
将以正则表达式\A*Module\sID=
但是现在你在正则表达式中想要拥有"
时遇到问题。您可以通过加倍将"
添加到逐字字符串中:
var module107 = Regex(@"\A*Module\sID=""107""");
答案 1 :(得分:1)
这将匹配模块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
)
)
答案 2 :(得分:1)
关键是你键入的文本首先被解释为字符串,然后被解释为正则表达式。字符串解释也会查看'\'并在解释中使用它们。
正如Tyanna所说,这意味着你需要逃避这些'',以便在读取字符串或混淆字符串解析器时不会“用完”。
您可能想尝试的另一种方法是使用字符串文字。使用正则表达式时,这可能会更清晰一些,因为你不会得到大量的斜杠(有时候只是更多的双引号):
var module107 = new Regex(@"\A*Module\sID=""107""");