0

以下に (php を使用して) 正規表現を作成しました。これは、 、、およびのみtermsを含む特定の文字列内のすべてに一致する必要があります。 a-z0-9._-

私の表現は次のとおり'~(?:\(|\s{0,},\s{0,})([a-z0-9._-]+)(?:\s{0,},\s{0,}|\))$~i'です。

私のターゲット文字列は次のとおり('word', word.2, a_word, another-word)です。結果に期待さtermsれるのは: word.2a_wordanother-wordです。

私は現在取得しています: another-word.

私の目標

ターゲット文字列から MySQL 関数を検出しています。これは正常に機能します。次に、そのターゲット文字列内のすべてのフィールドが必要です。それは私自身のORM用です。

この式の中にさらに括弧が含まれる場合があると思います。

4

2 に答える 2

1

私が知る限り、あなたはカンマ区切りの用語のリストを持っていて、 を満たすものだけを見つけたいと思っています[a-z0-9._\-]+。もしそうなら、これは正しいはずです(少なくともあなたの例では正しい結果を返します):

'~(?<=[,(])\\s*([a-z0-9._-]+)\\s*(?=[,)])~i'

主な問題は次のとおりです。

  • 末尾の $。クエリを文字列の末尾に固定していました
  • すべてを一致させる場合、前の一致の終わりから継続します。これは、1 つの一致の終わりにカンマ/閉じ括弧を一致させると、次の一致の最初の一致には存在しないことを意味します。(?<=...後読み ( ) と先読み ( (?=...)でこれを解決しました
  • 最初のバックスラッシュは、文字列の解析時に PHP によって削除される可能性があるため、バックスラッシュは二重にエスケープする必要があります。

編集:コメントで、一部の用語はコンマを含む文字列である可能性があると述べたので、最初にこれを介して入力を実行する必要があります:

$input = preg_replace('~(\'([^\']+|(?<=\\\\)\')+\'|"([^"]+|(?<=\\\\)")+")~', '"STRING"', $input);

すべての文字列を '"STRING"' に置き換える必要があり、他の正規表現との照合に問題なく機能します。

于 2012-07-11T13:59:02.027 に答える
1

正規表現の使用はやり過ぎかもしれません。この種のテキストでは、括弧を削除して文字列をコンマで分解するだけです。

于 2012-07-11T08:41:09.470 に答える