0

module107サンプルテキストと一致する必要がありますModule ID="107"

コードのどこが間違っているかを理解するのを手伝ってもらえますか?

var module107 = Regex("\A*Module\sID=\"107\"");

エラー: 認識できないエスケープ シーケンスです

4

3 に答える 3

4

ここでの問題は、2 つの異なるレベルでエスケープしたいということです。は\A、正規表現のエスケープ シーケンスです。しかし、問題は、最初にエスケープ シーケンスを解釈しようとする文字列があり、その文字列がエスケープ シーケンスを認識していない、\Aまたは\s(わからない) ことです。

次の 2 つの解決策が考えられます。

  1. 正規表現をエスケープする場合は、\. そう

    var module107 = Regex("\\A*Module\\sID=\"107\"");
    

    は文字列で、文字列が処理された後、正規表現は\A*Module\sID="107"

  2. 逐語的な文字列を使用します。文字列の前に a を追加すると@、エスケープ シーケンスは文字列によって評価されません。したがってRegex(@"\A*Module\sID=")、正規表現として終了します\A*Module\sID=

    しかし今"、正規表現に入れたいと問題が発生しています。"aを 2 倍にすることで、そのままの文字列に追加できます。

    var module107 = Regex(@"\A*Module\sID=""107""");
    
于 2013-05-23T21:07:56.853 に答える
1

説明

これはモジュール id="107" と一致します。ここで、数値は二重引用符で囲まれた任意の桁数です。エスケープされた引用符を変更し[""]て、文字列にネストできるようにしました。私が使用し\bているのは、単語の区切りを探し、文字列を入力のどこにでも表示できるようにするためです。ただし、特定のテキストを検証する場合は、代わりに\Aorを実行し^て文字列の先頭を示すことができます。

\b(Module\s+ID=[""](\d{1,})[""])

ここに画像の説明を入力

グループ

グループ 0 は文字列全体をキャプチャします

  1. Module から 2 番目の引用符までの have を取得します
  2. 引用符内の値を取得します

C# コード例:

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
        )

)
于 2013-05-23T21:00:30.150 に答える