ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

正規表現における先読みアサーション

先読みアサーション

正規表現では、次の 2 種類の前後参照アサーションがあります。先読みと後読みです。両方とも、アサーションが式との一致を返すために満たさなければならない条件になります。

"先読み" アサーションは (?=test) という形式で、正規表現内の任意の場所に置くことができます。MATLAB® は文字列の現在の位置からテスト条件を先読みします。MATLAB でテスト条件を一致させる場合、残りの式も続けて処理して一致部分を見つけます。

たとえば、パス文字列で先読みを行い、プログラム ファイルを含むフォルダー名を検索します (ここでは、fileread.m)。

str = which('fileread')
str =
   matlabroot\toolbox\matlab\iofun\fileread.m
regexp(str,'\w+(?=\\\w+\.[mp])','match')
ans = 
    'iofun'

一致の式 \w+ は、1 つまたは複数の英数字またはアンダースコア文字を検索します。regexp がこの条件と一致する文字列を検索するごとに、バックスラッシュ (2 つのバックスラッシュ \\ で指定されます) の後にファイル名 (\w+) と .m または .p の拡張子 (\.[mp]) が続く文字列を先読みします。関数 regexp は、先読み条件を満たす一致を返します (ここでは、フォルダー名 iofun)。

オーバーラップの一致

先読みアサーションでは、文字列の中の文字を処理しません。そのため、それを使用してオーバーラップする文字列を検索します。

たとえば、最初の文字とその後にさらに 5 文字続く文字列の一致を行い、文字列内の空白以外の 6 文字の文字列を "すべて" 検索します。

string = 'Locate several 6-char. phrases';
startIndex = regexpi(string,'\S(?=\S{5})')
startIndex =
     1     8     9    16    17    24    25

開始インデックスは、次のフレーズに対応します。

Locate   severa   everal   6-char   -char.   phrase   hrases

先読み演算子がないと、MATLAB は文字列を左から右に解析し、解析の進行と同時に文字列は処理されます。一致する文字が見つかると、regexp でその場所が記録され、最近一致した文字列の場所から文字列の解析が再開されます。このプロセスでは文字がオーバーラップして解析されることはありません。

string = 'Locate several 6-char. phrases';
startIndex = regexpi(string,'\S{6}')
startIndex =
     1     8    16    24

開始インデックスは、次のフレーズに対応します。

Locate   severa   6-char   phrase

論理 AND 条件

もう 1 つの先読み演算の用途は、2 つの条件間で論理演算 AND を実行する場面です。この例では、まずテキスト文字列内の小文字の子音がすべて検索されます。このテキスト文字列は、関数 normest のヘルプの最初の 50 文字です。

helptext = help('normest');
str = helptext(1:50)
str =
 NORMEST Estimate the matrix 2-norm.
    NORMEST(S

母音以外 ([^aeiou]) を探すだけでは、出力に大文字、空白文字、句読点が含まれるので、期待する答えを得られません。

c = regexp(str,'[^aeiou]','match')
c = 
  Columns 1 through 14

    ' '    'N'    'O'    'R'    'M'    'E'    'S'    'T'    ' '    
        'E'    's'    't'    'm'    't'
  ...

先読み演算子を使用し、次の AND 条件を作成して、再度試してみます。

(lowercase letter) AND (not a vowel)

今度は、結果が正しくなります。

c = regexp(str,'(?=[a-z])[^aeiou]','match')
c = 
  's'  't'  'm '  't'  't'  'h'  'm'  't'  'r'  'x'
     'n'  'r'  'm'

先読み演算子を使用して AND を実行する際には、テスト式 test"後に" 一致させる式 expr を配置しなければなりません。

(?=test)expr or (?!test)expr

参考

| |

詳細

この情報は役に立ちましたか?