0

PHPには、次のようなテキストに一致する正規表現があります。

第24回会議-クイックブラウンフォックス[2012年1月10日から2012年9月26日]

私が思いついたパターンは次のようになります。

$pattern = "/(([0-9]{1,2})(st|nd|rd|th)\sMeeting\s-\s)?(.*)(\[([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\sto\s([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\])$/"

これはうまくいくようです。

ただし、最後の日付部分はオプションにしたいのですが。しかし、私が追加するとき?日付のグループ化後、文字列内にある場合、preg_matchは日付を取得しなくなりました。。*が乗っ取っているのではないかと思いますが、うまくいかないようです。

4

3 に答える 3

1
(.*) --> (.*?)

遅延量指定子の詳細については、次を参照してください。

http://www.regular-expressions.info/repeat.html

于 2013-01-06T20:10:00.127 に答える
0

この小さな変更はそれを行います(太字)

/(([0-9]{1,2})(st|nd|rd|th)\sMeeting\s-\s)? (.*?) (\[([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\sto\s([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\]|$)$/

まず、フリーテキスト式をaで拡張して、?貪欲にしないようにします(他の投稿を参照)。

日付部分に|$追加されて、正確に日付または文字列の終わりであることを示します。

これがあなたの総正規表現です

/(([0-9]{1,2})(st|nd|rd|th)\sMeeting\s-\s)?(.*?)(\[([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\sto\s([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\]|$)$/

于 2013-01-06T20:24:29.757 に答える
0

ご想像のとおり、.*(貪欲な量指定子) はあまりにも多くの情報を食い尽くします。これは、遅延にするか、 などの別のものに置き換えることで解決できます[^[]*。ただし、後者の提案に置き換えると、文字列でのリテラルの使用が禁止さ[れます。

この問題を修正する以外に、保存する必要のない部分に非キャプチャ グループを使用する方法を学ぶ必要があります。これにより、正規表現が高速化され、メモリが節約されます。

これがあなたの問題に対する私の解決策です。大きな変化はありませんが、違いがわかるはずです。

/(([0-9]{1,2})(st|nd|rd|th)\sMeeting\s-\s)?(.*)(\[([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\sto\s([0-9]{1,2}\s(January|February|March|April|May|June|July|August|September|November|December)\s[0-9]{4})\])?$/

ここでデモと正規表現の説明を表示できます: http://regex101.com/r/vZ1nH6

Web サイトは PHP を使用しているため、問題に対して正確です。さらに詳しく知りたい場合は、www.regular-expressions.info で正規表現を読み、http://www.regex101.com/quiz/でクイズを確認することをお勧めします。

于 2013-01-06T20:10:26.097 に答える