2009-07-10 5 views
2

正規表現を使っていくつかのダーティなxml属性をクリーンアップしようとしている。C#Regex番号のついたサブグループのみを置換するが置換する

私の入力文字列は、私の意図した出力文字列は、私のコードは、今私は置き換えを行う必要があり、この

public static Regex regex1 = new Regex(
     "<\\w*\\s*(X:\\w*)", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

public void doRegex() 
{ 
    string InputText = @"<TD X:NUM class=xl101P24_2>I Want to send a FAX:but not </TD>"; 

    string result = regex1.Replace(InputText,""); 

    //result now = " class=xl101P24_2>I Want to send a FAX:but not </TD>" 
} 

のように見えるこの

<TD class=xl101P24_2>I Want to send a FAX:but not </TD> 

あるこの

<TD X:NUM class=xl101P24_2>I Want to send a FAX:but not </TD> 

ですが、は、番号付きの部分一致、すなわち「X:NUM」を置き換えたいだけです。どうすればいいですか?

マイケル

答えて

5

あなたは先読み構文を使用(マッチ接頭辞をそれを除外)する必要があります。この方法では、最初の部分(「<TD」の部分)が一致しないとも置き換えられません。ここで

"(?<=<\\w*)\\s*(X:\\w*)" 
+0

fantastic、thats it。 (?<= <\\ w * \\ s *)(X:\\ w *) " –

-1

はそれを行うための正規表現方法です。これをacheiveする別の方法は、第二を無視するだけで最初のグループとマッチ全体を置き換えるために置換文字列を使用することです

public static Regex regex1 = new Regex("^<\\w*\\s*td\\w*\\s*(X:\\w*)", 
RegexOptions.IgnoreCase 
| RegexOptions.CultureInvariant 
| RegexOptions.IgnorePatternWhitespace 
| RegexOptions.Compiled 
); 


or "^<\\w*\\s*td\\w*\\s*(X:\\w*)" 
+0

属性が正しく構成されていないため、XML解析を使用できません。私はstoopid生のテキストをクリーンアップしようとしているので、xmlとして解析することができます。 –

2

:-)( "属性を削除)あなたはそれを解析するXSLまたはXMLを使用してくださいいけない理由を疑問に思いますグループがらくたを含む。これは速くする必要がありますので、任意のルック先読みを必要とせず

string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)", "$1") 

は(簡単な実行が速く大きさの順であることを示した)。

持つように正規表現を変更します+ 2番目のグループの後にすべてのX:属性が削除され、最初のもの(これが関連している場合)だけでなく、

string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)+", "$1") 
関連する問題