2012-05-02 6 views
1

これは入力文字列です:$table_prefix = 'wp5t3s1tc_';これは大きな設定ファイルの一部です。より堅牢な正規表現のルックアラウンド

は私が働いている''

発現との間に何かを一致させたいのは理由前後参照は=の空白文字のいずれかの側で動作する脆性方法の素晴らしいではありません(?<=\$table_prefix(\s{2}=\s\'))(.*)?(?=\')です。設定ファイルが=の両側の複数のスペースで変更された場合、式は機能しません。

私はそれがより(?<=\$table_prefix(\s*\=\s*\'))(.*)?(?=\')のようになりますが、もちろんそれは動作しません考えています。

誰かがこの試合をより洗練された方法で簡単に説明できますか?

答えて

0

\$table_prefix\s*=\s*'(?<match>[^'.]*)'; 

チェックはここでgrepを使用して可能な解決策です。非常にエレガントではありませんが、=の周囲の可変スペースが心配な場合は、堅牢でなければなりません。

は可変長アサーションがgrepで許可されていないので、私の知る限り、私は考えることができる唯一のことは、二段階で抽出を行うことです:私は基本的に周りのすべてのスペースを獲得しています

grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | grep -oP '(?<='"'"').*'

最初に'wp5t3s1tc_と一緒に=を入力し、次に'の後にすべてを抽出します。奇妙な'"'"'は一重引用符文字をエスケープすることです。

それとも、代わりに二grepsedを使用することができます。

grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | sed 's/ *= *'"'"'//'

+1

ありがとうございました。私はそれをどう考えても決してありません! – Simon

-1

あなたは限り、あなたは '文字は、あなたが合うようにしようとしている順に表示されないことが保証されているすべてで前後参照を使用する必要はありません。補完的な正規表現を使って欲張り検索を使うことができます。有限オートマトンは、文字を含まない文字列と貪欲に一致します。

一重引用符でサブシーケンスのみを解析するには、名前付きグループ(または名前のないエンジンの場合は名前のないグループ)を使用します。この場合、名前ではなくインデックスでグループにアクセスする必要があります。 この正規表現は、あなたが求めるものを行います。http://rubular.com/

+1

あなたは絶対にそれは同じ正規表現エンジンであることを保証することができない限り、ウェブ事をチェックしません。 – tchrist

+0

彼は彼が使用している正規表現エンジンについて言及していませんでした。その上、私が使ったことはすべて、すべての新しい正規表現の標準的な定義にあります。これらの作品は、.NET、Java、Ruby、新しいPerlの正規表現で... –

+0

いいえ、それは当てはまりません。たとえば、それらを実行するにはJava v7とPerl v5.10が必要です。あなたが使用しようとしているツールは、そのツールだけでテストしてください。 – tchrist