2011-03-25 33 views
1

私はちょっとしたRegex初心者のように少し問題があります。それが問題ならば、私は.NETのRegexクラスを使っています。文字列に一致するネゲートされた文字クラス

まず、私は上の正規表現を使用しているデータの記述:ここ

が私の表現である:

(".*[^".]);(.*")

これは、彼らがより大きな行の一部だ(これらの2行を一致しますメインフレームコンピュータでのテーブルが、基本的に次のようになります):

例1:7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S;T GORANS SJH "

例2:2.;"1;AVD INGENJOR ";"N";"J";" ";

もこれを一致して(私はそれのためではない一致が好きなんでしょう):

;"U";33.75;777.;" ";

正規表現の意味は、すべてのセミコロンを見つけることです(;)以内引用符( ")を付けてコロン(:)で置き換えます。引用符の前後にセミコロンが付いているとは限りません(例1のように)。

7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S:T GORANS SJH "

2.;"1:AVD INGENJOR ";"N";"J";" ";

そして、それは、ドットとセミコロンの前の数字の任意の数を持っているので、最後の行には、手つかずのままにしてください:私が欲しいの出力があります(。)。

私はこれらのすべての行を単一の正規表現にマッチさせたいと考えています。私はすでに複数の正規表現を持つソリューションを持っていますが、私はそれを行うより良い方法が欲しいです。私は、否定的/肯定的な先読み/後ろ向きに本当に精通していませんが、解決策がその領域のどこかにあると感じています。

私はネゲートされた文字クラス内のグループと一緒に最初に考えていたので、私は一致したくない最初の$ 1のグループである.75を打ち消すことができました。それは75の代わりに任意の数にすることができます。

私は正規表現がまったくうまくいかないので、どんな助けも素晴らしいでしょう。

ありがとうございました!

答えて

1

つまり、引用符で囲まれた文字列の一部である場合にのみ、セミコロンをコロンで置き換える必要がありますか?

、あなたはこれを行うことができ、引用符が正しくバランスしていると仮定すると、("2\" by 4\""のように)引用文字列内に存在する一切の引用符がないこと:

resultString = Regex.Replace(subjectString, 
    @";   # Match a ; 
    (?=   # if it's followed by an odd number of ; -- namely: 
    [^""\r\n]* # 0+ non-quote, non-linebreak characters 
    ""   # One quote 
    (?:   # followed by... 
     [^""\r\n]*"" # an even number of non-quote-quote sequences 
     [^""\r\n]*"" 
    )*   # zero or more times 
    [^""\r\n]* # followed by zero or more non-quotes 
    $    # until the end of the line. 
    )    # End of lookahead", 
    ":", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); 
+0

ありがとうございました!私が思うフリードルの本を読んでみる必要があります。 また、コードに優れたコメントをお寄せいただき、ありがとうございます。 –

+0

私は確かにそれは働いていますか?私はrad正規表現デザイナーhttp://www.radsoftware.com.au/regexdesigner/でテストしました。それはうまく動作しません。 –

+0

あなたと一緒にテスト? –

0

';'で分割して配列を調べ、現在の文字列が「で始まらない」で始まる場合は、次の文字列に「:」を付けて結合し、これを続ける閉じた '' 'が見つかるか、配列の最後に到達しました。

すべての要素を'; 'で結合します。

ところで、 '' 'はエスケープされませんでしたか?これは、すべてのソリューションにとって問題を複雑にします。

+0

私はそのオプションについて考えましたが、regexpでそれを行う方がはるかにクリーンなようでした。偶数、そして決してエスケープされないので、それは問題ではなかっただろう、ありがとうtho ugh =) –

0

チェックこの正規表現:

(?<=("[^"]*";)|([^"];)+)"[^"]*[;][^"]*" 

それに少なくとも1つのセミコロンを持っている引用符の間に何も一致したが、唯一、それが引用符または二重引用符ではない何かによって、他の何かが先行していた場合。これはあなたの問題を避け、あなたが提供した文字列でチェックしました。

0

"[^";\n]*?(;)*?[^";\n]*?」、任意の前後参照せずにconstruct..Itsあなたがしなければならないのは、グループ1 \1をコロンで置き換えるだけです。

関連する問題