2010-12-16 12 views
2

私が反復することによって解決することができるソリューションを持っている問題を抱えているが、私は正規表現を使用して、よりエレガントな解決策があるかどう不思議とsplit()確定的有限オートマトンが最終状態に達するたびに文字列を分割しますか?

よ、私は(クリップボードに入れているエクセル)の文字列を持っています本質的にコンマで区切られています。セル値にカンマが含まれている場合、セル全体が引用符で囲まれている(おそらく、その文字列内のコンマをエスケープする)という警告があります。例えば次のように文字列は次のとおりです。

123,12,"12,345",834,54,"1,111","98,273","1,923,002",23,"1,243" 

は今、私はエレガントな個々の細胞にこの文字列を分割したいのですが、キャッチは、それはそのセルを分割しますので、私は、区切り文字としてカンマで、通常のスプリット式を使用することはできませんですその値にコンマを入れてください。この問題を見るもう1つの方法は、EVENのコンマに先行する数字がある場合は、カンマで区切ってのみにすることです。

これはループで簡単に解決できますが、このロジックをキャプチャできる正規のexpression.split関数があるのだろうかと思います。この問題を解決するために、私は論理のための決定論的有限オートマトン(DFA)を構築しました。

alt text

質問を以下に縮小される:(/ Sに対応する)新しいアレイエレメントがたびに(ここでは状態4)最終状態を生成するように、この文字列を分割する方法がありますDFAで届いていますか?正規表現(エスケープ)を使用

答えて

0

(?:(?:"[^"]*")|(?:[^,]*))

.NET、または他のプラットフォームでのアナログである)ことを使用して、(Regex.Matchesを呼び出します。 ^(?:(?:"(?<Value>[^"]*)")|(?<Value>[^,]*))(?:,(?:(?:"(?<Value>[^"]*)")|(?<Value>[^,]*)))*$

これは、1回のショットで全体の文字列を解析しますが、名前付きグループとこれを機能させるためのグループごとのマルチキャプチャ(.NETがサポートしている)必要があります。

あなたはさらにこれに上記を拡大することができます。

+0

私はVBAcript構文に頼らざるを得ません。私にとってはラッキーですが、VBScriptの実装では.Netのルック・ビハインド機能はサポートされていませんが、非常に似ていると思います。私はそれをテストするのを待つことができない、ありがとう! – Alain

0

適格コンマもある引用符の偶数に続いて、VBScriptのサポート先読みを行います。これを分割してみてください:

",(?=(?:[^""]*""[^""]*"")*[^""]*$)" 
関連する問題