- ベストアンサー
正規表現 許可文字列 かつ 指定連続文字列の排除
わかりにくいタイトルで恐縮です。 初歩的な問題かもしれませんが、もう何日も悩み続けており、ヒントでもいただけると助かります。 たとえば、 正規表現にて 英字のみ(1文字以上) という場合は preg_match("/[a-z]+/i",$string) という風にすればいいと思います。 ここで、英字のみ(1文字以上) しかし、abc という連続文字列があれば該当させない、という場合どういう正規表現を作ればいいのでしょうか? preg_match("/[a-z^(abc)]+/i",$string) みたいなヘンテコなものを作ってみたりしてみたのですが、文法違いなのか、やはり正常には動いてくれません。 ([^a][^b][^c]) なんていうのも違いますし。 狙いは、文字列の最初でも最後でも途中でも、指定文字以外や指定連続文字列がある場合は、エラーを出す、というようなものにしたいのです。 なにかヒントいただければと思います。
- SHlVA
- お礼率92% (60/65)
- PHP
- 回答数3
- ありがとう数2
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「Perl正規表現雑技」にそのまんまズバリな解答がありました。 ご質問の条件に合うようアレンジし、PHPで書くと次のようになります。 preg_match("/[0-9]+(?:(?!abc)[a-zA-Z])+[0-9]+/",$string) ちなみに、指定連続文字列が大文字小文字を区別するものと仮定して、敢えてi指定はしていません。 私の環境で試した結果、次のようになりました。 [12345ababbccc67890]:OK! [12345abcabbcc67890]:NG! [12345abbabccc67890]:NG! [12345aabbbabc67890]:NG! [12345ababb@$&67890]:NG! [12345ABBABCCC67890]:OK! ←大文字小文字を区別しているのに注意! [12345abc67890]:NG!
その他の回答 (2)
- taskuni
- ベストアンサー率71% (49/69)
preg_match("/(?(?=.*abc.*)^$|^[0-9]+[a-z]+[0-9]+$)/i",$str,$matches) 面白そうだったので作ってみましたが、あまり自信はありません。 (?=.*abc.*)が成立した場合、^$で必ず失敗、 (?=.*abc.*)が成立しなかった場合、^[0-9]+[a-z]+[0-9]+$を評価する正規表現です。(?) 合っているかどうか良く分かりません。
お礼
taskuni様 お礼が遅くなり申し訳ございません。 教えていただいたように試してみました。 思うような結果ができました!! 勉強になりました。 ありがとうございました。
- moon_night
- ベストアンサー率32% (598/1831)
正規表現一回でできるような気もしますが、 とりあえずif文でやればできます。 if (preg_match("/[a-z]+/i",$string) and !preg_match("/[abc]/i",$string)) { #OK } else { #NG }
補足
moon night様 ご回答ありがとうございます。 おっしゃるとおり、2度にわけるとできそうですね。 ただ、できれば正規表現1回でやれたらと思います。 また、運用上 18273aswjsi18726 という感じの文字列から探すことになり preg_match("/[0-9]+XXXX[0-9]+/i",$string); の XXXX の部分をどう作ればいいのか、と考えておりました。 先に言うべきことでした、申し訳ないです。
関連するQ&A
- 正規表現preg_match('#^(?:[a-z
preg_match('#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i', $hoge)の意味を教えて ・#iなので、デリミタは#。大文字小文字は無視 ・先頭に、【「:(英数字ハイフンが1回以上).」が、0回または1回の出現】が1回以上の繰り返し ・続いて、英字が2回以上の繰り返し と思い、 :123a-.ss てやってみたのですが、0が返ってきました。 この正規表現の意味と、 この場合、どんな文字列が当てはまるか知りたいです
- ベストアンサー
- PHP
- 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得
質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。
- ベストアンサー
- PHP
- 文字列全体に対する置き換え [正規表現]
正規表現での文字列全体に対する、マッチ箇所 への置き換えについて、アドバイスをもらえないでしょうか。 parlでいうg修飾子はphpには無く、 例えば、[preg_match]は[preg_match_all]という関数で対応出来ますが、 置き換えを行う[preg_replace]には[preg_replace_all]がありません。 それに類する関数も無いように思います。 これに関して、PHPではどのように対応すれば良いのでしょうか。
- ベストアンサー
- PHP
- 正規表現でシングルクォーテーション内の文字列を取る
正規表現でどうしても分からない状態です。よろしくお願いします。 PHP5.2で、 'You\'re pen' というシングルクォーテーションで囲まれた文字列を 正規表現で取得しようとしています。 preg_match_all("/\'([^\']*|\\\')*?\'/", $src, $matches); のようにしていますが、どうしても 'You\' までしか取れません。 どうしたら取れるでしょうか。。m(_ _)m
- ベストアンサー
- その他(プログラミング・開発)
- 正規表現で
正規表現で、英大文字と記号だけからなる文字列、を表すにはどうすればよいでしょうか。言い方を変えると、とにかく英小文字は含まないという事なんですが… [^a-z]+ かなと思ったのですがダメでした。 123#ABC : OK 123#aBC : NG みたいな感じです。 よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- 正規表現のコーディングについてお願いします。
こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php $str = 'Price \5800-'; //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す if ( preg_match('/\\\\\\d+/', $str, $match) ) { print_r($match); } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。
- 締切済み
- PHP
- 正規表現について教えて下さい
正規表現について教えて下さい $string = "LibrayMyUtil2File AppFile"; $pattern = '/([A-Z][a-z0-9]*)*([A-Z][a-z0-9]*)File/'; $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 App と表示される この例のように、「File」の前の単語に置き換えたいのですが、 このやり方だとpatternの「[A-Z][a-z0-9]*」が重複しているのが凡長だと思ってまして もっと短縮された書き方があれば教えてもらいたいです。
- ベストアンサー
- PHP
- 正規表現で文字列の抜き出し
PHP4で、文字列の中からマッチしたものを抜き出したいのですが、なかなか上手いこといきません。 $str = "<a href=http://www.abc.com/><b>ABC</b>company</a>"; preg_match("/<a href=(.*)>(.*)<\/a>/i",$str,$str_reg); http://www.abc.com/ と <b>ABC</b>company の2つを抜き出したいのですが、 <b>タグが邪魔をして抜き出せません。 どうすれば上記2つを抜き出せるのでしょうか?
- ベストアンサー
- PHP
お礼
skytemple様 回答ありがとうございます。 とてもシンプルで書きやすいですね。 本当に知らないことだらけです。 参考サイトを見ていろいろ勉強していきたいと思います。 ありがとうございました。