2012-05-31 11 views

答えて

10

のようなものを使用することができます

+0

説明をありがとう! – ahmd0

1

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

先読みで拡張可能な正規表現(より多くの条件をサポートできるように)が可能かもしれませんが、それはもっとうまくいくとは思っていません。

と同じ文字列でこのタイプのアクションを複数回実行したい場合、文字列にトークンが多数ある場合、文字列の解析とデータ構造の保存を検討することができます。

+0

私見ではない質問への答えに固執したいですしかしあなたは正しい。 – rekire

+0

ときどき「どのようにIXするのですか」という質問に対する最良の答えは、「Xをしないで、Yを代わりに」です.REは素晴らしいツールですが、チェーンソーもそうです - 私はまだそれらを釘で打つのに使わないでしょう: - ) – paxdiablo

+0

プログラミング言語は使用できません。それは正規表現でなければなりません。ごめんなさい。 – ahmd0

0

いいえ、あなたはviを使用していない場合を除き:それはこれはしかし、十分に近い、または類似であるかもしれない\&オペレータ

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

を持っています。

3

あなたは正規表現を使用する必要がある場合、あなたはあなたが単一の正規表現とすべて、あるいは正規表現を行う必要はありません実現

/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/ 
+0

非貪欲な正規表現の場合は – rekire

6

を使用することができます。

正規表現は入力クラスを捕捉するのには非常に適していますが、完全に固定された2つの文字列がある場合は、タイプのメソッドを使用してから結果をandだけ使用できます。

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

、あなたのような何かを試みることができる:

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

をしかし、あなたは、その後も、これらのスタンザが開始または終了の時に表示されたときに心配する必要がありますライン、およびその他のあらゆる種類のエッジケース(開始または終了のいずれか一方または両方、お互いに隣接して、Karen7またはadministrator-lesserのような名前など)が含まれます。それはそうだろうが、高度なenougeの正規表現エンジンで、これは小さな何か(に還元することができ、けれども

^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$ 

すべての可能性は、おそらくのような巨大なものになってしまいます可能にするために持っ

すべての前方見通し/バックトラッキングのためにより速くなります)。は、複雑な正規表現なし向上させることができることが

一つの方法は、境界チェックが必要とされないように、少し前に手あなたの文字列をマッサージすることです:

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

それはカンマで始まり、終わるようにその内のすべてのコンマが複製されています

:次に

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

あなたがはるかに簡単に確認するだけです0

と、これは前述のすべての潜在的な問題を削除します。

  • いずれかの文字列の先頭に。
  • 文字列の最後に。両方とも互いに当接している。
  • 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() 
    

    これを:おそらく


(あなたの言語が許すならば)これを行うための最善の方法は、単に何かのように、カンマで文字列を分割し、それらを検討することです彼らが出現する可能性があり、エッジの場合を検出するために必要な正規表現の「体操」をバイパスします。

また、おそらくあなたはこれが全体の文字列に一致、正規表現先読みソリューションです(OU \ =カレン

+0

もう一度、上記のように、説明のおかげで、これはregexpのみでなければなりません。 – ahmd0

+0

@ ahmd0、あなたは私が警告したすべての可能性を考慮して、私が与えた正規表現を調べることができます。または、あなたの正規表現エンジンが十分に進歩していれば、ユージーンのソリューションがおそらく最高です。 – paxdiablo

+0

+1。分裂とチェックを忘れてしまった(私は、私の記事の繰り返しチェックのためにこれだけを考慮する)。わかりませんが、パフォーマンスはこのように良いかもしれません。 – nhahtdh

-1

:-)同等の正規表現よりも読みやすいという利点がありますそれだけで、参照のために、任意の順序で必要な部品が含まれている場合。あなたが設定可能な変数のいくつかの並べ替えにパターンを格納しない場合、私は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 
+1

こんにちはとスタックオーバーフローへようこそ。これはよく質問に答えるかもしれません - しかし、少しの説明は常に良いアイデアです。 S/O上の初心者のヒープは、あなたから何かを学ぶかもしれません。あなたには明白かもしれないことが、彼らにはないでしょう。 –

関連する問題