私は主にOracleデータベースにアクセスするJavaデスクトップアプリケーションで5年間働いており、正規表現を使用したことはありません。今、私はStack Overflowに入り、それらについて多くの質問を目にします。何かが足りなかったような気がします。
正規表現は何に使用しますか?
PS私の悪い英語でごめんなさい
私は主にOracleデータベースにアクセスするJavaデスクトップアプリケーションで5年間働いており、正規表現を使用したことはありません。今、私はStack Overflowに入り、それらについて多くの質問を目にします。何かが足りなかったような気がします。
正規表現は何に使用しますか?
PS私の悪い英語でごめんなさい
正規表現(または正規表現)は、文字列のパターンマッチングに使用されます。したがって、特定のパターンに従っているため、テキストからすべての電子メールアドレスを引き出すことができます。
場合によっては、正規表現はスラッシュで囲まれ、2番目のスラッシュの後に大文字と小文字を区別しないなどのオプションが配置されます。これが良いものです:)
/(bb|[^b]{2})/i
話すと、「2beまたはnot2be」と読むことができます。
最初の部分は(ブラケット)で、パイプで分割されています| またはステートメントに等しい文字なので、(a | b)は「a」または「b」と一致します。パイプ領域の前半は「bb」と一致します。後半の名前はわかりませんが、角かっこで、「b」以外のものと一致します。そのため、そこに屋根のシンボルthingie(専門用語)があります。波状の角かっこは、その前にあるものの数と一致します。この場合、「b」ではない2つの文字です。
2番目の後の/は、大文字と小文字を区別しない「i」です。開始スラッシュと終了スラッシュの使用は環境固有であり、使用する場合と使用しない場合があります。
これに役立つと思う2つのリンクは次のとおりです。
Rubyの例を考えてみましょう。
puts "Matched!" unless /\d{3}-\d{4}/.match("555-1234").nil?
puts "Didn't match!" if /\d{3}-\d{4}/.match("Not phone number").nil?
「/\d {3}-\ d {4} /」は正規表現であり、ご覧のとおり、文字列内で一致するものを見つけるための非常に簡潔な方法です。
さらに、グループを使用すると、次のような情報を抽出できます。
match = /([^@]*)@(.*)/.match("myaddress@domain.com")
name = match[1]
domain = match[2]
ここで、正規表現の括弧はキャプチャグループを示しているため、一致したデータを正確に確認できるため、さらに処理を行うことができます。
これは氷山の一角にすぎません...テキストの処理を非常に簡単にする正規表現で実行できるさまざまなことがたくさんあります。
これまでで最もクールな正規表現:
/^1?$|^(11+?)\1+$/
数値が素数かどうかをテストします。そしてそれは動作します!!
注: 機能させるには、少しセットアップが必要です。テストする数値は、最初に「<code>1」の文字列に変換する必要があります。次に、式を適用して、文字列に「<code>1」の素数が含まれていないかどうかをテストできます。
def is_prime(n)
str = "1" * n
return str !~ /^1?$|^(11+?)\1+$/
end
詳細で非常に親しみやすい説明がAvinash Meetoo のブログにあります。
正規表現について学びたい場合は、Mastering Regular Expressionsをお勧めします。非常に基本的な概念から、さまざまなエンジンがその下でどのように機能するかについての話に至るまで、すべてを網羅しています。最後の 4 つの章には、PHP、.Net、Perl、および Java のそれぞれに特化した章もあります。そこから多くのことを学び、今でも参考にしています。
正規表現(略してregexまたはregexp)は、検索パターンを説明するための特別なテキスト文字列です。正規表現は、ステロイドのワイルドカードと考えることができます。
*.txt
ファイルマネージャですべてのテキストファイルを検索するなど、ワイルドカード表記に精通している可能性があります。正規表現に相当するものは.*\.txt$
です。
正規表現の優れたリソース:http://www.regular-expressions.info
正規表現を使い始めたばかりの場合は、The Regex Coach のようなツールを心からお勧めします。
http://www.weitz.de/regex-coach/
RegexBuddy についても良いことを聞きました:
These RE's are specific to Visual Studio and C++ but I've found them helpful at times:
Find all occurrences of "routineName" with non-default params passed:
routineName\(:a+\)
Conversely to find all occurrences of "routineName" with only defaults: routineName\(\)
To find code enabled (or disabled) in a debug build:
\#if._DEBUG*
Note that this will catch all the variants: ifdef, if defined, ifndef, if !defined
ご存じのとおり、Oracle には正規表現が追加されました: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html。いくつかのクエリで新しい機能を使用しましたが、他のコンテキストほど有用ではありませんでした。その理由は、正規表現が、非構造化データに埋もれた構造化データを見つけるのに最も適しているからだと私は信じています。
たとえば、正規表現を使用して、ログ ファイルに詰め込まれた Oracle メッセージを見つけることができます。メッセージがどこにあるかを知ることはできません。メッセージがどのように見えるかだけです。したがって、正規表現はその問題に対する最良の解決策です。リレーショナル データベースを扱う場合、通常、データは事前に構造化されているため、そのコンテキストでは正規表現は役に立ちません。
強力なパスワードの検証:
これは、少なくとも 1 つの大文字、1 つの小文字、および 1 つの数字を含む 5 ~ 10 文字の英数字の長さのパスワードを検証します。
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{5,10}$