6

たとえば、DN 文字列がある場合、次のようになります。

OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM

と の両方を持つ DN のみを選択する正規表現を作成する方法OU=KarenOU=admin?

4

6 に答える 6

11

これは正規表現の先読みソリューションであり、参照用に必要な部分が任意の順序で含まれている場合、文字列全体を照合します。ただし、パターンを何らかの構成可能な変数に保存しない場合は、nhahtdh のソリューションに固執します。

/^(?=.*OU=Karen)(?=.*OU=admin).*$/

^        - line start
(?=      - start zero-width positive lookahead
.*       - anything or nothing
OU=Karen - literal
)        - end zero-width positive lookahead
         - place as many positive or negative look-aheads as required
.*       - the whole line
$        - line end
于 2012-05-31T04:50:01.313 に答える
6

単一の正規表現、または単一の正規表現ですべてを行う必要はないことに気付きました。

正規表現は、入力のクラスをキャッチするのに非常に適していますが、完全に固定された文字列が 2 つある場合はcontains()、両方に -type メソッドを使用しandて結果を取得できます。

または、正規表現を使用する必要がある場合は、それを2 回 (文字列ごとに 1 回) 実行しand、結果を一緒にすることができます。

単一の正規表現でそれを行う必要がある場合は、次のようなものを試すことができます。

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,

ただし、これらのスタンザが行の先頭または末尾に表示されるタイミング、およびその他のあらゆる種類のエッジ ケース (先頭または末尾の一方または両方、両方が隣り合っている、Karen7またはadministrator-lesserのような名前) についても考慮する必要があります。すぐ)。

すべての可能性を考慮に入れる必要があると、おそらく次のような途方もない結果になります。

^OU=Karen(,[^,]*)*,OU=admin,|
^OU=Karen(,[^,]*)*,OU=admin$|
,OU=Karen(,[^,]*)*,OU=admin,|
,OU=Karen(,[^,]*)*,OU=admin$|
^OU=admin(,[^,]*)*,OU=Karen,|
^OU=admin(,[^,]*)*,OU=Karen$|
,OU=admin(,[^,]*)*,OU=Karen,|
,OU=admin(,[^,]*)*,OU=Karen$

ただし、高度な enouge 正規表現エンジンを使用すると、これをより小さなものに縮小できる可能性があります (ただし、すべてのフォワードルッキング/バックトラッキングのために、これ以上高速になる可能性は低いでしょう)。

複雑な正規表現を使用せずに改善できる方法の 1 つは、境界チェックが不要になるように、文字列を少し前にマッサージすることです。

newString = "," + origString.replace (",", ",,") + ","

カンマで始まりカンマで終わり、その中のすべてのカンマが複製されるようにします。

,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM,

次に、はるかに単純なものを確認するだけで済みます。

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,

これにより、前述の潜在的な問題がすべて削除されます。

  • 文字列の先頭のいずれか。
  • 文字列の末尾のいずれか。
  • 両方が互いに隣接しています。
  • Karen2偶然一致したような拡張名。

おそらくこれを行う最善の方法は (言語が許す場合)、単純に文字列をカンマで分割し、次のように調べることです。

str = "OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM"
elems[] = str.splitOn(",")

gotKaren = false
gotAdmin = false
for each elem in elems:
    if elem = "OU=Karen": gotKaren = true
    if elem = "OU=admin": gotAdmin = true

if gotKaren and gotAdmin:
    weaveYourMagicHere()

これは、それらが出現する順序を無視し、エッジケースを検出するために必要な正規表現の「体操」をバイパスします。

また、おそらく同等の正規表現よりも読みやすいという利点もあります:-)

于 2012-05-31T04:35:37.033 に答える
3

正規表現を使用する必要がある場合は、使用できます

/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/
于 2012-05-31T04:35:29.850 に答える
1

contains()、またはindexOf()条件の数だけ正確な文字列を確認できます。正規表現は必要ありません。

拡張可能な正規表現 (より多くの条件をサポートできるため) は先読みで可能かもしれませんが、それ以上のパフォーマンスが得られるとは思えません。

このタイプのアクションを同じ文字列に対して複数回実行する必要があり、文字列に多くのトークンがある場合は、文字列を解析して何らかのデータ構造に格納することを検討できます。

于 2012-05-31T04:34:24.387 に答える
0

いいえ、使用している場合を除き、そうではありませんvi:\&演算子があります

/(OU=Karen.*OU=admin|ou=admin.*OU=Karen)/

ただし、これは十分に近いか、類似している可能性があります。

于 2012-05-31T04:35:21.493 に答える
-1

(OU\=カレンのようなものを使用できます

于 2012-05-31T04:42:00.060 に答える