3

C#の正規表現に関する質問があります。

"文字の間のテキストを検索したい。例:

 Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>("Esto es una prueba");

一致:Esto es una prueba

しかし、この例では

Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>("Esto es una prueba");
pKR_MESAPUESTOASIGNACION.CONFIGTORNEO_ID = Valid.GetInt(dr.Cells["CONFIGTORNEO_ID"].Value);

一致:ただし、角かっこ()の間に記述されているため、Esto es una prueba一致してはなりません。CONFIGTORNEO_ID[]

簡単に言うと、二重引用符()文字の間の文字列を照合したいのです"が、その文字列を角かっこ()の間に記述してはなりません[]

これが私のコードです:

var pattern = "\"(.*?)\"";
var matches = Regex.Matches(fullCode, pattern, RegexOptions.Multiline);

foreach (Match m in matches)
{
    Console.WriteLine(m.Groups[1]);
}

そのパターンは文字間のすべての文字列に一致しますが"、角かっこで囲まれた文字列を除外するようにパターンを変更するにはどうすればよいですか?

- 編集 - -

別の例を次に示します。

List<String> IdSorteados = new List<String>();
int TablesToSort = 0;
foreach (UltraGridRow dr in fg.hfg_Rows)
{
    if (dr.Cells["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"].Value == DBNull.Value && !Valid.GetBoolean(dr.Cells["BELIMINADO"].Value) && (Valid.GetBoolean(dr.Cells["Seleccionado"].Value) || SortearTodo))
        TablesToSort++;
    }

式は、(内にある)または(MESA_ID内にある)と一致してはなりません。また、一致してはなりません(内にあります)Cells["MESA_ID"].ValuePuestoCells["Puesto"].Value].Value == DBNull.Value && dr.Cells[["MESA_ID"].Value == DBNull.Value && dr.Cells["Puesto"]

私の意図を明確にしたことを願っています。

4

4 に答える 4

2

単純にネガティブルックビハインドを使用します。

(?<!\[)

基本的に、先頭に.が付いていない場合にのみ文字列に一致します[ここでの例、および次のようにコーディングします。

String fullCode = "Enum resultado = SPDialogBox.Instance.show<ACTION_ENUMs.TORNEO_SORTEAR>(\"Esto es una prueba\");\r\n"
                + "pKR_MESAPUESTOASIGNACION.CONFIGTORNEO_ID = Valid.GetInt(dr.Cells[\"CONFIGTORNEO_ID\"].Value);";
String pattern = @"(?<!\[)\x22(.*?)\x22";
var matches = Regex.Matches(fullCode, pattern, RegexOptions.Multiline);
foreach (Match m in matches)
{
    Console.WriteLine(m.Groups[1]);
}
于 2012-04-17T15:32:25.883 に答える
1

引用符で囲まれたネストされた角かっこが一致しないようにするには、次のいずれかが当てはまるかどうかを確認する必要があります。

  • 冒頭の二重引用符の前にある最後の非空白文字は、、[または
  • 閉じの二重引用符に続く最初の非空白文字]

これは、次の正規表現を使用して実行できます。

(?<!\[\s*)\"[^"]*\"(?!\s*\])

.NET正規表現エンジンのルックアラウンド機能を使用します。

この式が、の代わりにを?使用して、引用符で囲まれた文字列内の不本意な修飾子を回避する方法に注意してください。[^"]*.*?

于 2012-04-17T15:38:00.557 に答える
0

私はこのようなものだと思います:

^[^\"]*\"([^\"]*)\".*$
于 2012-04-17T15:37:30.593 に答える
0

多くの場合、ソースコードファイル(php | cpp | java | js | css | etc)を解析し、正規表現をいくつか置き換える必要があります。一部の文字列/メッセージの置換を回避するために、置換を行う前にすべての文字列をマスクするため、可能なすべての文字列をキャプチャしてマスクする必要があります。

これが私がすべての文字列をキャプチャする方法です:/(['"])(\\\1|.)*?\1/gm つまり:

  • 一重引用符|二重引用符で始まるすべてをキャプチャします。['"]
  • スラッシュ(エスケープ\演算子)が前に付いている場合は、同じ引用記号(文字列の終わりとは見なされません)が続く場合でも、0個以上の文字が続く場合があります。(\\\1|.)*
  • 上記のパターンが最後の一致ではなく最初の出現で停止することを確認してください(つまり、貪欲にならないでください)。?
  • 最後に、同じ開始一重引用符と二重引用符が続く場合、文字列は終了します。\1

この検索をグローバル(可能なすべての一致をキャプチャするため)と複数行(CRLFで区切られた新しい行で文字列が継続しない場合があります)の両方で実行する必要があります。

おそらく、これらの弦楽団を見つけるだけでなく、キャプチャすることにも関心があるので(\\\1|.)*?、最終的なパターンを与えるグループ区切り文字内に配置するようにしてください。

([\'"])((\\\1|.)*?)\1

キャプチャされた文字列の例:

defined ( 'WP_DEBUG' ) || define( '\WP_DEBUG', true );
echo 'class="input-text card-number" type="text" maxlength="20"';
echo 'How are you? I\'m fine, thank you';

オンライン正規表現テスターで私のパターンを確認してください

于 2015-12-10T09:41:17.470 に答える