正規表現はプログラミングを行うために必須ですか?
32 に答える
それらがなくても簡単に行くことができますが、2つの理由から、(IMHO)基本を知っておく必要があります。
1) RegEx が当面の問題に対する最善の解決策となる時が来るかもしれません (下の画像を参照)
2) 他の誰かのコードで RegEx を見たとき、それは 100% 神秘的であってはなりません。
preg_match('/summarycount">.*?([,\d]+)<\/div>.*?Reputation/s', $page, $rep);
このコードは非常に単純ですが、RegEx を知らない場合、最初のパラメーターにあるものは火星の言語である可能性があります。ここで使用されている RegEx は、基本を学べば実際には非常に単純です。http://www.regular-expressions.info/にアクセスすると、RegEx とそのさまざまな実装に関する多くの情報が得られます。プラットフォーム/言語にも優れたチュートリアルがあります。その後、 RegexBuddy を確認してください。Regexを構築するのに役立ちます。また、Regex を構築している間、それが何をするかを観察すると、学習に役立ちます。これは、私が今まで使った中で最高の 39.95 ドルでした。
はい。それらがなくても管理できますが、ほとんどのコンピューティングタスクで使用できるため、少なくとも基本を学ぶ必要があります。長期的には、多くの苦痛と手間を省くことができます。正規表現は、最初の「wtf」ステージを通過すると、思ったよりもはるかに簡単です。
いいえ、必須ではありません。あなたは彼らを知らなくても完全に優れたプログラマーになることができます。
正規表現は、実際にアプリケーションコードを入力するためではなく、データ操作の1回限りのタスクに主に使用していることがわかりました。これらは入力データの検証に便利ですが、最近では、コントロールがとにかくそれを行うことがよくあります。
全くない。正規表現でできることは、正規表現なしでも完全に可能です。
ただし、これは強力なパターン マッチング システムであるため、単純な正規表現パターンで非常に簡単に実行できることでも、正規表現パターンを使用しないと多くのコードが必要になります。
たとえば、次のようになります。
s = Regex.Replace(s, "[bcdfghjklmnpqrstvwxz]", "$1o$1");
正規表現なしで行うには、もう少しコードが必要です。
StringBuilder b = new StringBuilder();
foreach (char c in s) {
if ("bcdfghjklmnpqrstvwxz".IndexOf(c) != -1) {
b.Append(c).Append('o').Append(c);
} else {
b.Append(c);
}
}
s = b.ToString();
または、プログラマーとしての経験があまりない場合は、さらに多くのコードを使用し、パフォーマンスが非常に悪いものを簡単に作成できます。
string temp = "";
for (int i = 0; i < s.Length; i++ ) {
if (
s[i] == 'b' || s[i] == 'c' || s[i] == 'd' ||
s[i] == 'f' || s[i] == 'g' || s[i] == 'h' ||
s[i] == 'j' || s[i] == 'k' || s[i] == 'l' ||
s[i] == 'm' || s[i] == 'n' || s[i] == 'p' ||
s[i] == 'q' || s[i] == 'r' || s[i] == 's' ||
s[i] == 't' || s[i] == 'v' || s[i] == 'w' ||
s[i] == 'x' || s[i] == 'z'
) {
temp += s.Substring(i, 1);
temp += "o";
temp += s.Substring(i, 1);
} else {
temp += s.Substring(i, 1);
}
}
s = temp;
ツールキットに正規表現があれば、時間と労力を大幅に節約できます。それらがなければ、何が欠けているのかわからないので、それでも幸せになります.
Web 開発者として、私はそれらを非常に頻繁に使用します (入力の検証、サイトからのデータの抽出など)。
編集:スタックオーバーフローの正規表現タグを見て、正規表現が使用されるいくつかの一般的な問題を調べるのに役立つかもしれないことに気付きました。
私はそう言うでしょう。
それらは非常に普遍的に有用であるため、少なくとも単純なものを読み書きする能力がまったくないことはかなり大きなハンディキャップです.
正規表現をサポートする言語
- ジャワ
- パール
- パイソン
- PHP .
- C#
- Visual Basic.NET
- ASP
- パワーシェル
- JavaScript
- ルビー
- tcl
- vbscript
- VB6
- XQuery
- XPath
- XSD
- MySQL
- オラクル
- PostgreSQL
正規表現をサポートする IDE とエディター
- エクリプス
- IntelliJ
- ネットビーンズ
- ゲル
- ビジュアルスタジオ
- ウルトラエディット
- J編集
- ネディット
- メモ帳++
- エディットパッド プロ
- vi
- emacs
- HAP編集
- PSパッド
grep
そして忘れないようにしましょうsed
!
雇い主としては、何千ものソース ファイルにまたがる同様の文字列のセットを、ときどき手動で検索/置換する必要があり、それを行うのに数時間または数日かかる優れたプログラマー、または優れたプログラマーが必要です。ときどき、コーヒーを飲みに行くのと同じことを行うために、正規表現を作成するのに 5 分、場合によっては 10 分も費やしますか?
このまさに回答における実世界の実用的な使用法
実際、私は実際にこの記事を作成する際に正規表現を使用しました。最初に、それをサポートする言語をコンマ区切りの散文でリストしました。(\w+),
その後、考え直して、式を検索し、JEditで置換することにより、形式を箇条書きリストに変更しました\n* $1
。そして、それらを使用して経験を積むほど、それらを使用することで、より短い一連のアクションに対してより費用対効果が高くなります。
いいえ。正規表現に触れることなく、何年もプログラミングを行うことができます。もちろん、RE:sを知っている誰かがそれらを使用する場合には、あなたが何か他のことをすることを意味します。特定の問題を解決する方法は常に複数あり、正規表現はパターンを表現する1つの方法(非常に効率的で、おそらく一般的な方法)にすぎません。
ソフトウェア エンジニアとしてキャリアを積みたいと考えているなら、そうです。私はソフトウェア エンジニアを雇っていますが、彼らが正規表現の使い方の基本を知らない場合、または正規表現について聞いたことがないとしたら、実際にプログラミング テクニック全体でどの程度の経験を積んでいるのだろうかと思います。彼らは他に何を知りませんか?
上記のコメントのほとんどは、「いいえ、他の方法で問題を解決できます」と言っており、代替手段はより多くのコードであり、書くのに時間がかかると言っています...保守性と、この特注のコードがどれほど簡単に変更できるかを考えてください. .. 正規表現を使用します。これは 1 行のコードです。
ジェフリー・フリードルが書いた「 MasteringRegularExpressions」という素晴らしい本があります。それは私に洞察を与え、読むことは本当に喜びでした。
私はそれほど頻繁に正規表現を使用していませんが、最近便利になりました。
入力:ある種の緩い形式、複数の翻訳、ことわざなどを含むCSV辞書ファイル。
出力:素敵なJSON。
最初の考え:考えられるすべてのフィールドと値を解析するための短い文法を記述します。
最初の試み:文法を書きましたが、データのわずか0〜1%で発生した、主に特殊なケースなど、いくつかの粗いエッジがありました。すべてを捉える文法を作成することは、あまりにも多くの設計でした。
2番目の試み:メインフィールドをキャッチする単純な文法を使用し、残りをルーチンに渡して、いくつかの正規表現を適用しました。完全な文法よりも速く、概念的に簡単で、書くのも楽しいものでした。
要約:正規表現は私に時間を節約し、実際にデータ内の特殊なケースとそれらがどのようにそしてどこに現れるかを見るのに役立ちました。
彼らは学ぶ価値がありますか?はい。
しなければならない?いいえ、しかし私は彼らに精通していない分野でほとんど誰も知りません。
学ぶのは難しいですか?全くない。
少なくとも、正規表現が存在し、それらを何に使用できるかを知ることは絶対に必要です。そうしないと、多くの状況で車輪の再発明を行う危険があります。それらの存在を知っている場合は、それらを適用する必要がある場合は、詳細に入ることができます。ところで、正規表現の背後にある理論は非常に興味深いです:-)
一言で言えば、いいえ。
しかし、それらは確かに適切な仕事のための適切なツールであり、それらが最もよく機能する文字列照合操作について学ぶ価値があります。しかし、あなたが良い、大きなハンマーを持っているという理由だけで、それはあなたがすべてのナットを割るためにそれを使うべきであるという意味ではありません。
というか、必須…という感じです。
たとえば、YouTube ビデオの一部が機能しない理由を調べていたところ、それらのビデオへのリンクが
http://ca.youtube.com/v/raINk2Ii1A4 (例として、実際の URL ではありません)
それ以外の
http://www.youtube.com/v/raINk2Ii1A4
以前、別のプログラマーが「substr()」を使用して YouTube 動画 ID を抽出しましたが、ca.youtube.com の部分が原因で、ID が間違って抽出されました。
私の感覚では、正規表現は非常に重要であり、正規表現がないと、隠れたバグが通常より頻繁に発生する可能性があります。
いいえ、私自身は正規表現が苦手で、それでもプログラマーとしては下手です。待って。何?
もっと深刻なことに、私は正規表現を知りませんが、正規表現が必要になることはほとんどありません。本当に必要な場合、たとえば Dave が言及したようにユーザー入力を検証する必要がある場合は、同僚に尋ねます。
プログラマーとして知ったり学んだりする価値のあることはたくさんありますが、正規表現はそのリストのトップに近いとは言えません。
いいえ...そしてはい、
これは、「Cを学ぶべきか」という質問の1つと非常によく似ています。正規表現が必ずしも何かをする唯一の方法であるとは限りません。しかし、それらは多くの場合、コードを単純化し、(私が本当に思うに)コードをより読みやすくすることができる有用な抽象化です。ジェフ・フリードルの正規表現をマスターするのが好きな のかもしれませんし、perlで仕事をしているからかもしれません。しかし、どういうわけか、正規表現は私のツールです。今では、他のほとんどの文字列操作手法よりも正規表現を使用する方が簡単なようです。
コンピュータサイエンスの理論分野では、非常に強力で便利な「機器」です。正規言語を定義し、NFAまたはDFAでさえ識別できるため、計算理論または有限自動および形式言語分野でいくつかの難しい定理を証明できます。 。実際のプログラミングでは、これを使用すると比較的簡単な方法で複雑な文字列操作を実行できるため、非常に便利です。
おそらくそうではありません。しかし、それらは本当に簡単に習得できます。少なくとも基本 (すべての正規表現エンジンが行うこと) はすぐに教えられます。30分ほどで別の男のチャットウィンドウでそれを学びました...
必須ではないと思いますが、それらはあなたの生活を楽にし、時間を大幅に節約します。
正規表現の使い方がわからない場合は、何が欠けているのかわかりません。しかし、それを使って仕事をこなしている人を見ているだけで、これは絶対に身につけておくべきスキルだと感じます。
正規表現は、使用しない場合でも少なくとも学習することが重要です。
まず、他人の正規表現コードを読んで理解できなければなりません。
第 2 に、基本的な正規表現は (クリーネの定理による) 有限オートマトンに対応するため、アルゴリズム設計にとって根本的に重要になります。
実は女の子用カンニングスカートもある
http://store.xkcd.com/xkcd/#RegexCheatSkirt
あなたがたまたま女の子なら、これは素晴らしい学習の機会になるかもしれません。
いいえ、適切な要件については、常に他に 2 つのオプションがあります。
正規表現を知っている友人に尋ねてください。
SOに問題を投稿してください。
少なくとも最低レベルで、正規表現が何をするか/何ができるかを理解することは非常に重要です。背後にある概念と NFA を理解すれば、他の問題をよりよく理解できるようになります。
正規表現を使い始めることに関しては、必要ではありませんが、本当に価値があると思います。実際のところ、正規表現エンジンはすべて異なるため、1 つを習得したとしても、他の場所ではすぐに実行できない場合があります。
私は他の人たちに同意しますが、それはおそらく必須ではありませんが、少なくとも基本的な理解を持っていることは非常に役立ちます。キューブにRegExチートシートを投稿しました。これは非常に役立ちます。http://regexlib.com/CheatSheet.aspx
正規表現を理解することは必須ではありません。ただし、テキストを処理するための効果的なツールです。テキストを操作するプロジェクトで作業する場合、最終的にはそれらに出くわします。
正規表現には、使用している場合でも、正規表現を含むコードをサポートしている場合でも、さまざまな課題が伴います。構文にはさまざまな種類があることに注意してください。ライブラリや言語が異なれば、構文規則もわずかに異なることがよくあります。正規表現は、複雑になるにつれて、単純なパターンマッチングツールから魔法のようなものに簡単に移行できるため、簡単に理解できないコードのみを記述します。また、ほとんどのテキスト処理ツールと同様に、トラブルシューティングや変更が難しい場合があります(たとえば、ツールの機能に適合しなくなったコーナーケースがある場合など)。
すべての解析コードと同様に、私は多くの単体テストをお勧めします。特に、エッジの状態、繰り返されるテキストパターン、異常な入力に注意してください。
確かにそうではありませんが、私は(多くの人と同じように)何年も彼らに触れずにプログラミングを行ってきました。そうは言っても、あなたがそれらを知るようになると、あなたはそれらが過去にどこで有用だったかもしれないかを見始めます:-)
私が言いたいのは、基本を読んで、正規表現とは何か、そして正規表現で何ができるかを理解することです。それから、正規表現が役立つと思われる場合は、http://www.regularのようなチュートリアル/リファレンスWebサイトを入手できます。 -expressions.info/とすぐにジャンプします。
分野によっては、正規表現に役立つ特定の問題があります。つまり、その逆です。正規表現を使用しない/しない/という解決策は非常に不器用です。電子メールの検証/URLの検証/最小のパスワード強度/日付の解析が思い浮かびます。
そうではないはずです。優れたプログラマーはそれを知っておくべきだという認識がありますが、私はそうは言いません。時が来て、あなたがそれを必要とするとき、あなたはそれを使うでしょう。とにかく、それを使用しないで6か月間与えてください、そしてあなたはどんな表現オプションも覚えていません。
プログラミングの事実のすべてのように、あなたはそれを学び、あなたはそれを忘れ、あなたはそれを再び学びます。
いいえ。
達成しようとしていることに応じて、正規表現が役立ちます。しかし、プログラマーの 80% 以上が正規表現をまったく使用せず、約 15% 程度がたまにしか使用せず (Google で検索する必要があります)、残りのわずかな% だけが実際に正規表現忍者を食べているという危険があります。
Regexrは、まれに Regex を使用する場合に非常に適していることがわかりました。
また、誰かが次の 1 分かそこら以内に jwz からの特定の引用に言及します...
多くの文字列操作、検索、置換などを行う場合に必要です。
正規表現は、強力なパターン マッチング言語です。また、テキスト文字列に限定されません。しかし、いつものように、あなたのコード、あなたの呼び出し。
たとえば、HTML を知っているか、リレーショナル データベースを使用できるかどうかにすぎません。厳密に言えば、それらはプログラミングを行うための要件ではありません。仕事によっては不可欠で基本的なものでも、他の仕事では無関係かもしれません。新しいイーサネット チップ用のデバイス ドライバを作成する際に、正規表現 (さらに言えば HTML や SQL) を使用することはほとんどありません。私の分野では、実動コードで正規表現を使用することもありますが、アドホック スクリプトでレポートを操作する場合などに正規表現を使用することがよくあります。コンパイルされたルール セットを生成するための特定のキー フレーズ)。
何をするかによると思います。mod_rewrite には必須です。しかし、ほとんどの場合、それらがなくても移動できることに同意します。しかし、そうでなければ多くの退屈な時間がかかるいくつかのタスクの時間を大幅に節約できます。
単純に、いいえ。それはすべて、プログラムが何を達成しようとしているのかによって異なります。
もちろん、RegExp とは何かを知り、それらがどのように機能するかについての基本的な理解は、将来役立つ可能性があります。
新しい製品を開発している場合は、それらを避けるか、せいぜい慎重かつ慎重に使用することをお勧めします。
すでに正規表現を使用している製品を維持している場合、選択の余地はありません。
少なくとも正規表現を認識できるようにしておくと、特に難読化されたコードに遭遇した場合に、参照カードを見つけるための正しい検索用語がわかります。