3

888 / 444、888 / 447、または888/405を含むファイル名を除き、888を含むすべてのファイル名に一致する正規表現を作成するのに問題があります。

キャラクタークラスを使って否定してみましたが、うまくいかなかったようです。助言?

これが私たちが試したことです:/888.[^(444)|(447)|(405)]/

Ruby1.9.3を使用しています。ありがとう!

4

5 に答える 5

3

ネガティブ先読みを使用する:

888.(?!(444)|(447)|(405))
于 2013-03-25T10:06:59.883 に答える
3

助言:

%r"888(?!/444|/447|/405)"
于 2013-03-25T10:07:32.437 に答える
2
[^a-z]

範囲外の文字に一致しますa-z。あなたの試みでは、キャラクタークラス内に交代群を配置しましたが、それは単にそのようには機能しません。代わりに、ネガティブルックアラウンドアサーションを使用する必要があります(Rubyがこれらをサポートしていると想定)。

/^888(?!(44[47]|405)).*$/

これを分解するには:

^           # Anchor to start of string
888         # Match 888
(?!         # Negative lookahead
  (         # Alternation group
    44[47]  # Match 444 or 447
    |       # ...or...
    405     # 405
  )
)
.*          # Match any number of any characters
$           # Anchor to end of string

「任意の数の任意の文字に一致する」という部分は、ネガティブ先読みによって制限されるため、要件に従って444、447、および405は一致しないことに注意してください。

したがって、これは、と一致888123しますが、またはなど888 foo barは許可されません。888444888447


編集文字列内のどこかに表示されるという要件に一致させるには:

/888(?!.*4(4[47]|05)).*/

つまり、444、447、または405を除いて、任意の888の後に何か(何も含まない)が続くものと一致します。

于 2013-03-25T10:07:12.747 に答える
2

私は一緒に行くつもりです:

/^(?!.*888\/(444|447|405)).*888.*/

もっと簡単な方法があるとは思いません。

于 2013-03-25T10:32:03.690 に答える
0

現在のような非常に具体的なことを念頭に置いている場合は、逆に一致させてから、一致するアイテムを除外してみませんか?

そのようです:

/(888\/444)|(888\/447)|(888\/405)/

不要なものと一致する場合は、これを使用して、それに応じて削除してください。

于 2013-03-25T10:10:11.210 に答える