どのように私は適切に正規表現と一致していますか?
-
20-08-2019 - |
質問
私はldapsearch
からのオブジェクトの出力のリストを持っています:
dn: cn=HPOTTER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=HGRANGER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=RWEASLEY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=DMALFOY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=SSNAPE,ou=FACULTY,ou=HOGWARTS,o=SCHOOL
dn: cn=ADUMBLED,ou=FACULTY,ou=HOGWARTS,o=SCHOOL
<時間>
これまでのところ、私は、次の正規表現を持っています:
/\bcn=\w*,/g
このような結果を返します:
cn=HPOTTER,
cn=HGRANGER,
cn=RWEASLEY,
cn=DMALFOY,
cn=SSNAPE,
cn=ADUMBLED,
<時間>
私はこのような結果を返す正規表現を必要とします:
HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED
どのようなパターン(cn=
とカンマ)が結果に含まれていないので、私は私の正規表現に変更する必要がありますか?
編集のIは、パターンマッチングを行うことsed
使用、および他のコマンドラインユーティリティへの出力を配管する
解決
は、より簡単な構文解析の問題ではなく、正規表現のようですね。 ANTLR文法は時間がない中で、これを整理します。
他のヒント
あなたはグループ化を実行する必要があります。これは、正規表現にを変更することによって行われます:
/\bcn=\(\w*\),/g
このは、グループ化変数にあなたの結果を移入します。あなたの言語に応じて、どのようにこの値を抽出するために異なります。
(のSED のとあなたのための変数は\ 1になります))ほとんどの正規表現のフレーバーは、あなたが(括弧をエスケープする必要はありませんが、あなたが使用しているので、上記のように、のSED のあなたがする必要があります。
私が提案する正規表現に優れたリソースの場合: Mastering Regular Expressionsをする
OK、あなたはより具体的な質問をし場所がこれの「正確な複製」として閉鎖されたので、私はそこからここに私の答えをコピーしています:
あなたはsedを使用する場合は、次のようなものを使用することができます:
sed -e 's/dn: cn=\([^,]*\),.*$/\1/'
[^,]*
それは任意の次の文字を見る前にそれができることはすべて一致します意味する「貪欲」であるため、あなたは.*
使用する必要があります。あなたが\(.*\),
を使用する場合それは意味あなたのパターンではない最初のカンマまでの、最後のコンマまで一致します。
のExpresso に私は私の正規表現を構築するために、過去にそれを使用しているチェックしてください。あまりにも学習を支援するために良いです。
迅速かつ汚い方法は、あなたのエンジンがそれをサポートしていると仮定しサブマッチを使用することです。
/\bcn=(\w*),/g
そして、あなたが最初の部分マッチを取得したいです。
あなたが使用しているどのような言語を知らなければ、我々は確かに言うことはできませんが、ほとんどの正規表現のパーサでは、あなたがそのような
のように括弧を使用している場合/ \ BCN =(\ * W)/ G
あなたは正確にあなたが探しているものとして、最初に一致したパターン(多くの場合、\ 1)を取得することができます。具体的には、我々はあなたが使用している言語を知る必要があります。
あなたの正規表現は、先読みとLookbehindsは、あなたが使用することができますサポートしている場合
/(?<=\bcn=)\w*(?=,)/g
これが一致します。
HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED
ではなく、cn=
か、どちらかの側に,
。コンマとは<=>まだそれがちょうど結果に含まれていない、試合のためにそこにする必要があります。