2009-06-30 14 views
6

regexをいつ使用するのか、String.Replace()(.NET)のような組み込みの文字列関数をいつ使うべきかについてはほとんど議論していません。Regexと組み込みのStringメソッドを使用するタイミング

文字列を扱うたびに(常に表示する以外には)常に正規表現を使用することを常に多くの人が推奨しているようです。これは本当にベストプラクティスか、間違った印象ですか?問題が "このテキストからこれらの単語のいずれかの出現を取り除く"だけの場合、正規表現を使うことは過度のようです。

私は自分のコードを改善し、文字列操作に関する他の人の質問に答えることができるように、入力を希望します(たくさんあります)。

+1

この質問は、前の週abouta頼まれました:http://stackoverflow.com/questions/1038186/are-there-particular-cases-where-native-text-manipulation -is-more-desirable-than/ –

+0

@streetpc:リンクありがとうございます。私はしばらく前にそれを見たことがあると確信していましたが、私はそれを見つけることができませんでした。 – Tomalak

答えて

9

文字列ベースの検索/置換が可能な場合、Regexをキャッチオールソリューションとして使用するのは間違っていると思います。

正規表現は本質的にパターンマッチングのプロセスであり、マッチさせたい文字列のタイプが可変であるか、または特定のパターンにしか適合しない場合に使用する必要があります。単純な文字列検索で十分である場合は、Stringクラスの組み込みメソッドを使用することを常にお勧めします。

Regexベースの検索が文字列のインデックス作成よりも高速でパフォーマンスが良いことを示すパフォーマンス統計は見たことがありません。さらに、Regexエンジンは実行能力が異なります。

あまりにも不十分であるとしても、Regexのマッチングを使用してパフォーマンスを実際に最適化したい場合は、Regexの深い知識が必要なので、非常に悪い(例えばバックトラックをたくさん使用する)Regexを構築するのはかなり簡単です。 。一方、n00bが文字列ベースの検索や置換を実行するのは非常に簡単です。

+0

それも私が考えたものです。すべての文字列ベースの答えには5つの正規表現の答えがあるように見えます。 – colithium

+1

StackOverflowではどういう意味ですか?それは、人々が明白ではない文字列関連の質問だけを聞き、残りの部分を解決する傾向があるからかもしれません。非自明型の問題には、しばしばRegexソリューションが必要です。それでも、これは、両方の方法の賛否両論の一般的な表現とはみなされるべきではない。 :-) – Cerebrus

0

私は文字列クラスの一部として望むように文字列を操作する専用の関数があるとすれば、正規表現が汎用であるため、「良い」にかなり近いはずです。

しかし、主観的なものと同様に、パフォーマンスの時間について懸念がある場合は、さまざまな方法です。

もう一度、理解しやすいようにして、実際のボトルネックを見つけるためのパフォーマンス監視を行ってください。

2

Regex.Replace()はString.Replace()メソッドよりもはるかに高価です。可能であればString.Replace()を使用し、必然性がある場合はRegexを使用してください。

時間差を見るにはbenchmarkをご覧ください。

2

私は正規表現が大好きですが、シンプルなxxx-> replace( "foo"、 "bar")タイプの関数があれば、単純なドライバーでは正規表現のような電動ツールを使うのは馬鹿に思えます。

パフォーマンスが問題である場合、正規表現は単純な置換では非常に多くのCPUを消費する可能性があります。 (Regexは通常、一連の "より単純な"呼び出しより複雑な検索/変換でより効率的に動作します)。

また、Pythonsのように、組み込みのmatch()に "^ ... $"を含めるようなマイナーな実装の違いによって、私はその時にインターネットにアクセスできない道にいて、何が起こっていたのかを知るためにLutzの本の別のコピーを買ってしまった!

+0

パワーツールは、あなたが釘の銃で壁に手を釘付けするまで楽しいです –

1

明らかに、複雑な検索/照合/置換操作では、正規表現が使用できます。単一の単語を別の単語に置き換えるなどの単純な処理では、通常の文字列メソッドが優先されます。

しかし、多くの場合、それほど簡単ではありません。時には、標準的な文字列演算を使用できる状況に遭遇することがありますが、正規表現の解法はより洗練されています。バニラ文字列アルゴリズムが10倍高速であっても、その特定のコードで問題があるかどうかを尋ねることは常に良い考えです(たとえば、コードがループ内で実行されない場合など)。

純粋な文字列操作を使用して、より複雑で高速なアルゴリズムより単純な正規表現操作の可読性を好むでしょう。

ちょうど私の2セント...

関連する問題