2012-01-11 8 views
1

私はCの書き込みに苦労している正規表現。私はabcを捕まえることができる式を書こうとしています。例えば、私は、文字列があります。Regex - Cで繰り返しグループをキャプチャする

<a href="function(##abc##);function(##abc##)"> 

を私はabcをキャプチャし、xyzとそれを交換したいです。

私はこれがabcの最初の出現ではなく、秒1をキャプチャ(")([^"]*)(##abc##)([^"]*)(")

のようなものを試してみました。助けてもらえますか?

おかげであなたは、すべての出現箇所が一致していることを達成するために最初のものだけでなく、グローバルフラグを設定する必要があり、いくつかのプログラミング言語で

+1

あなたはどの言語を使用していますか? –

+0

btw:あなたの正規表現はあまりにも複雑です。通常の検索と置き換えも同様です。 – TimWolla

+0

C#.netは私が使っているものです。これを扱うにはregex.replace関数を使いたいと思っています。出来ますか? –

答えて

0

出力
private class Replacer 
{ 
    private bool inQuotes; 
    public string Replace(Match m){ 
     if(m.Value == "\""){ 
      inQuotes = ! inQuotes; 
     }else if (inQuotes && m.Value == "##abc##"){ 
      return "##xyz##"; 
     } 
     return m.Value; 
    } 
} 

input = "<a href=\"function(##abc##);function(##abc##)\">"; 
Console.WriteLine(Regex.Replace(input, "\"|(##abc##)", (new Replacer()).Replace)); 

<a href="function(##xyz##);function(##xyz##)"> 

を使用すると、XMLで作業している場合、あなたはおそらくしたいが、多くの場合、フラグは、次のような試合の評価を使用することができ、「G」

+0

ここでは該当しません。 'Regex#Replace'(静的なものではなくインスタンスメソッド)は、デフォルトでグローバルですが、置き換えの最大回数を指定することができます。 –

0

ですXPathを使用して最初に引用符間のテキストを見つけ、正規表現または直接文字列置換を使用して置換を行います。 HTML(XHTMLではない)で作業している場合は、http://htmlagilitypack.codeplex.com/のようなライブラリを使用して同様のことを行うことができます。

また

(そしておそらく最悪オプション)これは、仕事をするようだが、かなりではない、単一の正規表現を使用します

Match match = (new Regex("(?:\")([^\"]*?(##abc##))+[^\"]*(?:\")")).Match(input); 

あなたはその後、match.Groupsでマッチの各を反復処理することができます[ 2]。キャプチャ。ただし、各キャプチャのインデックスと長さを使用して、実際の置換を手動で行う必要があります。

+0

私はmatchevaluatorに追加の引数を渡すのを助けることができます..私はその代理人を知っている私たちはそれを渡すことができます..しかし、私は引数として2つの文字列を渡したいと思います? –

関連する問題