タグ付けされた質問 「regular-expressions」

Wikipediaによると、正規表現(regexまたはregexpと略される)は、主に文字列とのパターンマッチングまたは文字列マッチング、つまり「検索および置換」のような操作で使用する検索パターンを形成する文字のシーケンスです。


10
正規表現の構文設計の可読性が低い特定の理由はありますか?
プログラマは皆、コードの可読性が機能する短い構文のワンライナーよりもはるかに重要であることに同意しているように見えますが、上級開発者がある程度の精度で解釈する必要があります-それはまさに正規表現が設計された方法のようです。これには理由がありましたか? 私たちは皆、それselfDocumentingMethodName()がはるかに良いことに同意しe()ます。なぜ正規表現にも当てはまらないのですか? 構造的な編成のない1行のロジックの構文を設計するのではなく、 var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})(0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; そして、これはURLの厳密な解析でさえありません! 代わりに、基本的な例として、パイプライン構造を整理して読みやすくすることができます。 string.regex .isRange('A-Z' || 'a-z') .followedBy('/r'); 正規表現の非常に簡潔な構文は、最短の操作と論理構文以外にどのような利点がありますか?最終的に、正規表現の構文設計の可読性が低い特定の技術的な理由はありますか?

25
電子メールアドレスの検証はどこまで行う必要がありますか?
電子メールアドレスの検証はどこまで行われるべきかと思います。私の分野は主にWeb開発ですが、これはどこでも当てはまります。 私はいくつかのアプローチを見てきました: 「@」が存在するかどうかを単純に確認します。これは非常に単純ですが、もちろんそれほど信頼できません。 標準の電子メール形式のより複雑な正規表現テスト 完全な正規表現に対するRFC 2822 -これに伴う問題は、多くの場合、電子メールアドレスが有効であるかもしれないということですが、それはおそらく、ユーザーがどのような意味ではありません DNS検証 SMTP検証 多くの人が知っているかもしれませんが(多くの人は知らない)、電子メールアドレスには、ほとんどの人が通常考慮しない多くの奇妙なバリエーションがあります(RFC 2822 3.4.1を参照)が、あなたの検証:電子メールメッセージをアドレスに送信できるようにするか、それともユーザーが入力することを意図したものであるかを確認しようとしていますか(それ以外の場合は、「有効」 'アドレス)。 私が検討したオプションは、より難解なアドレスで警告を出すだけですが、リクエストは通過できますが、これによりフォームがより複雑になり、ほとんどのユーザーが混乱する可能性があります。 DNS検証/ SMTP検証は非常に簡単に思えますが、DNSサーバー/ SMTPサーバーが一時的にダウンし、ユーザーがどこかに登録できない、またはユーザーのSMTPサーバーが必要な機能をサポートしていないという問題が発生することを予測しています。 ここにいる経験豊富な開発者の中には、これをどのように扱うのでしょうか?私がリストしたもの以外のアプローチはありますか? 編集:私はすべての中で最も明白なことを完全に忘れて、確認メールを送信しました!それを指摘してくれた回答者に感謝します。はい、これは非常に簡単ですが、関係者全員の面倒な作業が必要です。ユーザーは電子メールを取得する必要があり、開発者はユーザーデータが有効であると確認される前にユーザーデータを記憶する必要があります。

23
すべてのプログラマーが正規表現を学ぶ必要がありますか?[閉まっている]
私はプログラミングが初めてで、インタビューで正規表現に関する質問がありました。言うまでもなく答えられませんでした。だから私は正規表現を学ぶべきかどうか疑問に思っていましたか?すべての分野のすべてのプログラマーにとって必須ですか?または、特定のフィールドのプログラミングには必須ですか? 関連する質問: 正規表現が病的なほど魅力的なのはなぜですか? 正規表現を使用すべきでない場合

18
正規表現をどのように学習しますか?[閉まっている]
どこで学ぶべきかを尋ねているのではありません。私はオンラインでたくさんの良いリソースと本などを見つけました。 しかし、私はそれらにどのように取り組んでいますか。それの始まり、終わりはどこですか?正規表現プロセッサはいつテキストを進めますか、いつスタンドを保持して別の一致を試みますか?等 エジプトのピラミッドの象形文字を理解しようとしている気がします。

11
力を失うことなく読みやすい正規表現はありますか?
多くのプログラマーは、最近ではWebサービスの助けを借りて、またはより伝統的に対話型プロンプトで、または開発中の正規表現とテストケースのコレクションを持つ小さなスクリプトを書くことで、簡単な正規表現を作成する喜びを知っています。いずれの場合も、プロセスは反復的でかなり迅速です。必要なものが一致してキャプチャされ、不要なものが拒否されるまで、暗号のような文字列をハッキングし続けます。 単純な場合、結果はJava正規表現として次のようになります。 Pattern re = Pattern.compile( "^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$" ); また、多くのプログラマーは、正規表現を編集したり、レガシーコードベースの正規表現をコード化するだけで苦労することも知っています。それを分割するために少し編集すると、上記の正規表現は正規表現にかなり精通している人にとってはまだ非常に簡単に理解でき、正規表現のベテランはそれが何をするかすぐに見るべきです(誰かが運動をしたい場合には、投稿の最後に答えて自分自身でそれを理解する)。 しかし、正規表現が真に書き込み専用になるために物事はそれほど複雑になる必要はなく、勤勉な文書(もちろん誰もが書いているすべての複雑な正規表現についてもそうです)でさえ、正規表現の修正は困難な仕事。正規表現を慎重に単体テストしないと、非常に危険な作業になる可能性があります(ただし、もちろん、すべての複雑な正規表現(ポジティブとネガティブの両方)に対する包括的な単体テストがあります...)。 それで、長い話を簡単に言えば、正規表現の力を失うことなく、書き込み/読み取りソリューション/代替がありますか?上記の正規表現は、代替アプローチではどのようになりますか?どんな言語でも構いませんが、多言語ソリューションが最適ですが、正規表現は多言語です。 そして、以前の正規表現が行うことはこれです:formatの数字の文字列を解析し、1:2:3.4各数字をキャプチャします。スペースが許可され、3必要な場合のみです。

5
正規表現を使用すべきではない場合 [閉まっている]
正規表現はプログラマーの武器の強力なツールですが、最良の選択ではない場合や、まったく有害な場合もあります。 簡単な例#1は、regexpでHTMLを解析することです -多数のバグへの既知の道。おそらく、これも一般的な解析に起因します。 しかし、正規表現のための他の明らかに禁止された領域はありますか? ps: " あなたが尋ねている質問は主観的であり、閉じられそうです。 "-したがって、私は正規表現の使用が問題を引き起こすことが知られている例に興味があることを強調したいと思います。

6
複雑な正規表現の単体テストが必要ですか?
アプリケーションで複雑な正規表現の単体テストを作成する必要がありますか? 一方では、入力と出力の形式は単純で明確に定義されていることが多いため、テストが容易であり、非常に複雑になることが多いため、テストは特に価値があります。 一方、それら自体は、あるユニットのインターフェースの一部ではありません。インターフェイスのみをテストし、暗黙的に正規表現をテストする方法でテストする方が良い場合があります。 編集: 私は、これが内部コンポーネントの単体テストの特殊なケースであるとコメントしているDoc Brownに同意します。 しかし、内部コンポーネントの正規表現にはいくつかの特別な特性があります。 単一行の正規表現は、実際には独立したモジュールではなく、非常に複雑になる可能性があります。 正規表現は、副作用なしで入力を出力にマップするため、個別にテストするのは非常に簡単です。

7
正規表現は実際にどのように機能しますか?
エッセイが書かれた文書があるとします。このエッセイを解析して、特定の単語のみを選択します。クール。 正規表現を使用すると、ファイルを行ごとに解析し、単語ごとに一致を検索するよりも高速ですか?もしそうなら、それはどのように機能しますか?各単語を見るよりも速く進むにはどうすればよいですか?

4
正規表現はプログラミング言語ですか?
学術的な意味では、正規表現はプログラミング言語として認められますか? 私の好奇心のための動機は、SOの質問尋ね、私はただ見「Xを行うとregexができますか?」そして、それらを使用する可能性のある解決策について一般的な意味で何が言えるのだろうかと思いました。 私は基本的に「正規表現チューリングは完了していますか?」

17
なぜ正規表現は病的なほど魅力的ですか?
ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 図表1、図表2、他の例を思い出すのは難しくないと思います。 問題は、問題を解決する方法が複数ある場合、PHPプログラマー(私は通常StackOverflowでPHPタグを参照します)が正規表現に関連するソリューションのヘルプを求めます。 場合でも、それは、あまり経済的になる場合でも、 PHPのマニュアルは(示唆リンクを使用するために)str_replaceどんなのではなく、preg_*またはereg_*全く空想の置換規則が必要とされていない場合機能。 誰かがこれがなぜ起こるのかについての手がかりを持っていますか? 誤解しないでください。私の親友の何人かは正規表現であり、Perlを軽deしていません。私が手に入らないのは、オーバーキルが明らかな場合(文字列を切り替える正規表現)またはコードの複雑さが指数関数的に増加する場合(PHPで htmlからデータを取得するための正規表現)

5
csv形式は正規表現で定義できますか?
同僚と私は最近、純粋な正規表現がcsv形式を完全にカプセル化できるかどうかを議論しました。これにより、任意のエスケープ文字、引用文字、および区切り文字を含むすべてのファイルを解析できます。 正規表現は、作成後にこれらの文字を変更できる必要はありませんが、他のエッジケースで失敗してはなりません。 これはトークナイザーだけでは不可能だと主張しました。これを行うことができる唯一の正規表現は、トークン化だけでなく、非常に複雑なPCREスタイルです。 私は次のラインに沿って何かを探しています: ... csv形式はコンテキストのない文法であるため、正規表現のみで解析することは不可能です... それとも私は間違っていますか?POSIX正規表現だけでcsvを解析することは可能ですか? たとえば、エスケープ文字と引用文字の両方がの"場合、これらの2行は有効なcsvです。 """this is a test.""","" "and he said,""What will be, will be."", to which I replied, ""Surely not!""","moving on to the next field here..."

7
ほとんどが1つの正規表現で構成される大きな関数をリファクタリングする必要がありますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 約100行にわたる関数を作成しました。それを聞いて、あなたはおそらく私に単一の責任について教えて、私にリファクタリングを促すように誘惑されるでしょう。これは私の本能でもありますが、問題は次のとおりです。関数は 1つのことを行います。複雑な文字列操作を実行し、関数の本体は主に1つの冗長な正規表現で構成され、文書化された多くの行に分割されます。正規表現を複数の関数に分割すると、実際に言語を切り替えているため、実際に読みやすさが失われ、正規表現が提供する一部の機能を利用できなくなるためです。ここに私の質問があります: 正規表現を使用した文字列操作に関しては、大きな関数本体は依然としてアンチパターンですか?名前付きキャプチャグループは、機能と非常に似た目的を果たしているようです。ところで、正規表現を通るすべてのフローのテストがあります。

6
正規表現でできること/すべきことは何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 私は最近、正規表現を学び、それらを書く/使うのが大好きです。アイデアとそれらを使用する機会を探していますが、人々からよく警告されるように、万能ツールとしてそれらを使いすぎたくありません。 どのような種類の正規表現を使用する必要があり、どこで使用しないのですか?(明らかなことは別として:HTML解析)。

1
Java正規表現パターン-時定数またはインスタンスメンバーをコンパイルしますか?
現在、正規表現でマッチングを行っているシングルトンオブジェクトがいくつかあり、私Patternのsは次のように定義されています。 class Foobar { private final Pattern firstPattern = Pattern.compile("some regex"); private final Pattern secondPattern = Pattern.compile("some other regex"); // more Patterns, etc. private Foobar() {} public static Foobar create() { /* singleton stuff */ } } しかし、先日、これは悪いスタイルであり、Patternsは常にクラスレベルで定義されるべきであり、代わりにこのように見えると誰かに言われました: class Foobar { private static final Pattern FIRST_PATTERN = Pattern.compile("some regex"); private …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.