正規表現で文字の代わりにキーワードを使用できないのはなぜですか?
-
08-07-2019 - |
質問
OK
RegExは実行時に解釈/解析されるため、パフォーマンスのためですか? (コンパイルされていない)
または、書き込みの速度を上げるためですか?あなたがいくつかの<!> quot; simple <!> quot;を学ぶとき、キーワードの代わりに1文字を入力する方が簡単になりますか?
解決
本当にこれが必要ですか?
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
他のヒント
正規表現には数学的な(実際には言語理論)背景があり、数学的な公式のようにコーディングされています。たとえば、一連のルールで定義できます。
- すべての文字はそれ自体を表す正規表現です
-
a
およびb
が正規表現である場合、a?
、a|b
およびab
も正規表現です - ...
キーワードベースの言語を使用すると、単純な正規表現にとって大きな負担になります。ほとんどの場合、単純なテキスト文字列を検索パターンとして使用します。
grep -R 'main' *.c
または非常に単純なパターン:
grep -c ':-[)(]' seidl.txt
正規表現に慣れると、この構文は非常に明確で正確になります。より複雑な状況では、大きな正規表現は明らかに読みにくいため、おそらく他のものを使用します。
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実装は、この例が今日機能するほど十分に完成しています。
キーワードがある場合、実際に一致したテキストとキーワードを簡単に区別するにはどうすればよいですか?空白はどのように処理しますか?
ソーステキスト 会社: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)
いいえ、おそらく良くないでしょう。
形式言語理論とその数学表記に対応しているため。
これはPerlのせいです...!
実際、より具体的には、正規表現は初期のUnix開発からのものであり、簡潔な構文はそれよりもはるかに高く評価されていました。ストレージ、処理時間、物理端末などはすべて非常に限られており、今日とは異なります。
Wikipediaの正規表現の歴史で詳細を説明しています。
正規表現に代わるものがありますが、実際に成功したかどうかはわかりません。
編集:ジョン・サンダースによる修正:正規表現はUnixでポピュラー化されましたが、最初に QED エディター。以前のシステムにも同じ設計上の制約が適用されていました。
実際、いや、世界はUnixで始まったわけではありません。ウィキペディアの記事を読むと、それがわかります
1950年代、数学者のStephen Cole Kleeneは、正規集合と呼ばれる数学表記を使用してこれらのモデルを説明しました。 SNOBOL言語はパターンマッチングの初期の実装でしたが、正規表現とは異なります。 Ken Thompsonは、テキストファイルのパターンを照合する手段として、Kleeneの表記をエディターQEDに組み込みました。彼は後にこの機能をUnixエディターedに追加し、最終的に人気のある検索ツールgrepの正規表現の使用に至りました
これはPERLよりもはるかに早いです。 正規表現に関するウィキペディアのエントリは、UNIXのケントンプソンによる正規表現の最初の実装を示しています。名声、QEDでそれらを実装し、 ed エディターで実装しました。コマンドにはパフォーマンス上の理由で短い名前が付けられていたと思いますが、クライアント側になる前のことです。 正規表現の習得は、正規表現についての素晴らしい本で、正規表現に注釈を付けるオプションを提供します(/ xフラグ)読みやすく理解しやすくします。
UNIXに由来する多くのことのように、正規表現の概念は簡潔であり、読みやすさよりも簡潔さを優先しているためです。これは実際には良いことです。私は最終的に、15行の長さの正規表現を作成しました(私の判断に反して)。それが冗長な構文を持っていた場合、正規表現ではなく、プログラムになります。
実際には<!> quot; wordier <!> quot;を実装するのは非常に簡単です。正規表現の形式-私の回答こちらをご覧ください。簡単に言うと、正規表現文字列を返す(必要に応じてパラメーターを受け取る)少数の関数を作成します。
キーワードが利益をもたらすとは思わない。正規表現自体は複雑ですが、非常に強力でもあります。
私がもっと混乱していると思うのは、すべてのサポートライブラリが、古典的なPerl正規表現を使用(または拡張)するのではなく、独自の構文を発明していることです(例:\ 1、$ 1、{1}、... 。
あなたの質問に間違った方法で答えていることは知っていますが、 RegExBuddy には正規表現を説明する機能があります平易な英語で。これにより、学習が少し簡単になる場合があります。
使用している言語が Posix regexes をサポートしている場合は、それらを使用できます。
例:
\d
と同じ
[:digit:]
大括弧表記は、一致するものがはるかに明確です。 <!> quot;暗号化されたワイルドカード文字と記号は、他の人のコードでも見られ、理解する必要があるので、私はまだ学びます。
regular-expressions.infoのページの表には、さらに多くの例があります。
何らかの理由で、以前の回答が削除されました。とにかく、 http://www.rubyregexp.sf.net 。私自身のプロジェクトですが、動作するはずです。