1. ホーム
  2. java

[解決済み] ある文字列の後に他の文字列が続かない場合にマッチする正規表現

2022-06-25 07:12:16

質問

にマッチする正規表現が必要です。 blahfooblah にマッチするが blahfoobarblah

fooと、その後にbarが続かない限り、fooの周りのものだけにマッチさせたい。

これを使ってみました。 foo.*(?<!bar) というのはかなり近いのですが、これでは blahfoobarblah . 後ろの否定的なルックはバーだけでなく、何にでもマッチする必要があります。

私が使っている特定の言語はClojureで、Javaの正規表現が使われています。

EDIT: より具体的には、私はまた、それが blahfooblahfoobarblah を渡す必要がありますが blahfoobarblahblah .

どのように解決するのですか?

試してみてください。

/(?!.*bar)(?=.*foo)^(\w+)$/

テスト

blahfooblah            # pass
blahfooblahbarfail     # fail
somethingfoo           # pass
shouldbarfooshouldfail # fail
barfoofail             # fail

正規表現の説明

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    bar                      'bar'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    foo                      'foo'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

その他の正規表現

を除外したいだけなら bar の直後で foo の直後にある場合は

/(?!.*foobar)(?=.*foo)^(\w+)$/


編集

質問を具体的にするために、更新を行いました。

/(?=.*foo(?!bar))^(\w+)$/

新しいテスト

fooshouldbarpass               # pass
butnotfoobarfail               # fail
fooshouldpassevenwithfoobar    # pass
nofuuhere                      # fail

新しい説明

(?=.*foo(?!bar)) を保証します。 foo が見つかるが、直接は続かない bar