module107
サンプルテキストと一致する必要がありますModule ID="107"
コードのどこが間違っているかを理解するのを手伝ってもらえますか?
var module107 = Regex("\A*Module\sID=\"107\"");
エラー: 認識できないエスケープ シーケンスです
ここでの問題は、2 つの異なるレベルでエスケープしたいということです。は\A
、正規表現のエスケープ シーケンスです。しかし、問題は、最初にエスケープ シーケンスを解釈しようとする文字列があり、その文字列がエスケープ シーケンスを認識していない、\A
または\s
(わからない) ことです。
次の 2 つの解決策が考えられます。
正規表現をエスケープする場合は、\
. そう
var module107 = Regex("\\A*Module\\sID=\"107\"");
は文字列で、文字列が処理された後、正規表現は\A*Module\sID="107"
逐語的な文字列を使用します。文字列の前に a を追加すると@
、エスケープ シーケンスは文字列によって評価されません。したがってRegex(@"\A*Module\sID=")
、正規表現として終了します\A*Module\sID=
しかし今"
、正規表現に入れたいと問題が発生しています。"
aを 2 倍にすることで、そのままの文字列に追加できます。
var module107 = Regex(@"\A*Module\sID=""107""");
これはモジュール id="107" と一致します。ここで、数値は二重引用符で囲まれた任意の桁数です。エスケープされた引用符を変更し[""]
て、文字列にネストできるようにしました。私が使用し\b
ているのは、単語の区切りを探し、文字列を入力のどこにでも表示できるようにするためです。ただし、特定のテキストを検証する場合は、代わりに\A
orを実行し^
て文字列の先頭を示すことができます。
\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
)
)