8

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=パターン (およびコンマ) が結果に含まれないようにするには、正規表現で何を変更する必要がありますか?

編集:パターン マッチングを行うために使用sedし、出力を他のコマンド ライン ユーティリティにパイプします。

4

7 に答える 7

13

グループ化を実行する必要があります。これは、正規表現を次のように変更することによって行われます。

/\bcn=\(\w*\),/g

これにより、結果がグループ化変数に取り込まれます。この値を抽出する方法は、言語によって異なります。( sedを使用している場合、変数は \1 になります)

ほとんどの正規表現フレーバーでは、括弧 () をエスケープする必要はありませんが、sedを使用しているため、上記のようにエスケープする必要があります。

正規表現に関する優れたリソースについては、次をお勧めします: Mastering Regular Expressions

于 2009-01-26T18:00:23.200 に答える
4

OK、あなたがより具体的な質問をした場所は、これの「正確な複製」として閉鎖されたので、そこからここに私の答えをコピーしています:

sed を使用する場合は、次のようなものを使用できます。

sed -e 's/dn: cn=\([^,]*\),.*$/\1/'

[^,]*sed では「貪欲」であるため、使用する必要があります.*。つまり、次の文字を見る前に、可能なすべてのものに一致します。つまり\(.*\),、パターンで を使用すると、最初のコンマまでではなく、最後のコンマまで一致します。

于 2009-01-26T18:41:13.320 に答える
2

お使いのエンジンがサブマッチをサポートしていると仮定して、サブマッチを使用するのが手っ取り早い方法です。

/\bcn=(\w*),/g

次に、最初のサブマッチを取得します。

于 2009-01-26T18:01:10.343 に答える
2

使用している言語がわからないと、確かなことはわかりませんが、ほとんどの正規表現パーサーでは、次のように括弧を使用すると

/\bcn=(\w*),/g

そうすれば、最初に一致するパターン (多くの場合 \1) をまさに探しているものとして取得できます。具体的には、使用している言語を知る必要があります。

于 2009-01-26T18:01:40.563 に答える
2

正規表現を構築するために過去に使用したExpressoを確認してください。学習にも役立ちます。

于 2009-01-26T18:00:23.233 に答える
2

正規表現が先読みと後読みをサポートしている場合は、使用できます

/(?<=\bcn=)\w*(?=,)/g

それは一致します

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

しかし、両側のcn=または ではありません。,コンマcn=は、一致するためにまだそこにある必要がありますが、結果には含まれていません。

于 2009-01-26T18:52:07.433 に答える
-1

正規表現ではなく、単純な解析の問題のように聞こえます。ANTLR 文法は、これをすぐに整理します。

于 2009-01-26T17:59:47.523 に答える