12

さて、正規表現の基本はほとんど理解できませんが、暗号化されたワイルドカード文字や記号の代わりにキーワード (SQL など) を使用するように設計できなかったのはなぜでしょうか?

正規表現は実行時に解釈/解析されるため、パフォーマンスのためですか? (未コンパイル)

それとも、書き込み速度のためですか?いくつかの「単純な」文字の組み合わせを学ぶと、キーワードの代わりに 1 文字を入力する方が簡単になると考えていますか?

4

14 に答える 14

35

あなたは本当にこれが欲しいですか?

Pattern findGamesPattern = Pattern.With.Literal(@"<div")
    .WhiteSpace.Repeat.ZeroOrMore
    .Literal(@"class=""game""").WhiteSpace.Repeat.ZeroOrMore.Literal(@"id=""")
    .NamedGroup("gameId", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal(@"-game""")
    .NamedGroup("content", Pattern.With.Anything.Repeat.Lazy.ZeroOrMore)
    .Literal(@"<!--gameStatus")
    .WhiteSpace.Repeat.ZeroOrMore.Literal("=").WhiteSpace.Repeat.ZeroOrMore
    .NamedGroup("gameState", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal("-->");

わかりました、でもそれはあなたの葬式です、男。

これを行うライブラリをここからダウンロードしてください:
http://flimflan.com/blog/ReadableRegularExpressions.aspx

于 2009-03-10T10:32:26.640 に答える
10

正規表現は数学的 (実際には言語理論) の背景を持ち、数式のようにコード化されています。たとえば、一連のルールによってそれらを定義できます。

  • すべての文字はそれ自体を表す正規表現です
  • abが正規表現の場合a?a|babも正規表現です
  • ...

キーワードベースの言語を使用すると、単純な正規表現に大きな負担がかかります。ほとんどの場合、単純なテキスト文字列を検索パターンとして使用します。

grep -R 'main' *.c

または、非常に単純なパターン:

grep -c ':-[)(]' seidl.txt

正規表現に慣れると、この構文は非常に明確で正確になります。より複雑な状況では、大きな正規表現は明らかに読みにくいため、おそらく別のものを使用するでしょう。

于 2009-03-10T10:30:05.103 に答える
8

Perl 6 は、正規表現の可読性においてかなり革命的な一歩を踏み出しています。次の形式の住所を考えてみましょう: 100 E Main St Springfield MA 01234

これを解析するための適度に読みやすい Perl 5 互換の正規表現を次に示します (多くのコーナー ケースは処理されません)。

 m/
     ([1-9]\d*)\s+
     ((?:N|S|E|W)\s+)?
     (\w+(?:\s+\w+)*)\s+
     (ave|ln|st|rd)\s+
     ([:alpha:]+(?:\s+[:alpha:]+)*)\s+
     ([A-Z]{2})\s+
     (\d{5}(?:-\d{4})?)
  /ix;

この Perl 6 正規表現は同じ動作をします:

grammar USMailAddress {
     rule  TOP { <addr> <city> <state> <zip> }

     rule  addr { <[1..9]>\d* <direction>?
                  <streetname> <streettype> }
     token direction { N | S | E | W }
     token streetname { \w+ [ \s+ \w+ ]* }
     token streettype {:i ave | ln | rd | st }
     token city { <alpha> [ \s+ <alpha> ]* }
     token state { <[A..Z]>**{2} }
     token zip { \d**{5} [ - \d**{4} ]? }
  }

Perl 6 文法はクラスであり、トークンはすべて呼び出し可能なメソッドです。次のように使用します。

if $addr ~~ m/^<USMailAddress::TOP>$/ {
     say "$<city>, $<state>";
}

この例は、私がFrozen Perl 2009ワークショップで行った講演からのものです。Perl 6 の Rakudo 実装は、この例が現在機能するほど十分に完成しています。

于 2009-03-15T17:52:57.070 に答える
7

キーワードがある場合、実際に一致したテキストとどのように簡単に区別できるでしょうか? 空白をどのように処理しますか?

原文 会社名:A 部署名:B

標準正規表現:

Company:\s+(.+)\s+Dept.:\s+(.+)

あるいは:

Company: (.+) Dept. (.+)

キーワードの正規表現(ストローマンを取得しないように一生懸命努力しています...)

"Company:" whitespace.oneplus group(any.oneplus) whitespace.oneplus "Dept.:" whitespace.oneplus group(any.oneplus)

または簡略化:

"Company:" space group(any.oneplus) space "Dept.:" space group(any.oneplus)

いいえ、おそらく良くありません。

于 2009-03-10T10:34:54.640 に答える
5

形式言語理論に対応し、数学表記だからです。

于 2009-03-10T10:27:46.997 に答える
4

パールのせいだ…!

実際、より具体的には、正規表現は初期の Unix 開発に由来し、簡潔な構文は当時よりもはるかに高く評価されていました。現在とは異なり、ストレージ、処理時間、物理端末などはすべて非常に限られていました。

ウィキペディアの正規表現の歴史で詳しく説明されています。

正規表現に代わるものはありますが、実際に普及したものがあるかどうかはわかりません。

編集: John Saunders による修正: 正規表現はUnix によって普及しましたが、 QEDエディターによって最初に実装されました。以前のシステムには、同じ設計上の制約がさらに適用されました。

于 2009-03-10T10:20:15.547 に答える
3

実際、いいえ、世界は Unix から始まったわけではありません。ウィキペディアの記事を読めばわかります

1950 年代、数学者のスティーブン コール クリーネは、正規集合と呼ばれる彼の数学表記法を使用してこれらのモデルを記述しました。SNOBOL 言語はパターン マッチングの初期の実装でしたが、正規表現と同一ではありませんでした。Ken Thompson は、テキスト ファイル内のパターンを照合する手段として、Kleene の表記法をエディター QED に組み込みました。彼は後にこの機能を Unix エディタ ed に追加し、最終的に人気のある検索ツール grep で正規表現を使用するようになりました。

于 2009-03-10T10:27:57.917 に答える
2

これは、PERL よりもはるかに古いものです。ウィキペディアの正規表現に関するエントリでは、正規表現の最初の実装は UNIX で有名な Ken Thompson によるものであり、彼は正規表現を QED に、次にedエディターに実装しました。パフォーマンス上の理由から、コマンドには短い名前が付けられていたと思いますが、クライアント側になる前です。Mastering Regular Expressionsは、正規表現に関する優れた本であり、読みやすく理解しやすくするために、正規表現に (/x フラグを使用して) 注釈を付けるオプションを提供しています。

于 2009-03-10T10:29:22.983 に答える
1

私はあなたの質問に間違った方法で答えることを知っていますが、RegExBuddyにはあなたの正規表現を平易な英語で説明する機能があります。これにより、習得が少し簡単になる場合があります。

于 2009-03-10T11:51:43.987 に答える
1

UNIX に由来する多くのものと同様に、正規表現の考え方は簡潔であり、読みやすさよりも簡潔さを優先するためです。これは実際には良いことです。15行の長さの正規表現を(私のより良い判断に反して)書くことになりました。それが冗長な構文を持っている場合、それは正規表現ではなく、プログラムになります。

于 2009-03-10T10:25:33.943 に答える
1

実際には、「より冗長な」形式の正規表現を実装するのは非常に簡単です。ここで私の回答を参照してください。簡単に言うと、正規表現文字列を返す (そして必要に応じてパラメーターを取る) いくつかの関数を作成します。

于 2009-03-10T10:26:59.040 に答える
1

キーワードは何の利益ももたらさないと思います。正規表現自体は複雑ですが、非常に強力でもあります。

もっと紛らわしいと思うのは、すべてのサポート ライブラリが、従来の Perl 正規表現を使用 (または拡張) する代わりに、独自の構文を発明していることです (例: \1、$1、{1}、... 置換およびその他の多くの例)。

于 2009-03-10T11:16:11.967 に答える
1

何らかの理由で、以前の回答が削除されました。とにかく、 http://www.rubyregexp.sf.netで、Ruby regexp マシンが法案に適合すると思います。それは私自身のプロジェクトですが、うまくいくと思います。

于 2011-07-01T15:43:36.297 に答える
1

使用している言語がPosix 正規表現をサポートしている場合は、それらを使用できます。

例:

\d

と同じだろう

[:digit:]

ブラケット表記は、それが一致しているものについてより明確です。「不可解なワイルドカード文字と記号は、他の人のコードでまだ見られ、理解する必要があるため、引き続き学習します。

regular-expressions.info のページの表に、さらに例があります。

于 2009-03-15T18:20:11.683 に答える