1. ホーム
  2. regex

[解決済み] 文字、数字、- _の正規表現

2022-04-29 05:34:40

質問

PHPで、ある値が以下の組み合わせのいずれかであるかどうかをチェックするのに苦労しています。

  • 文字 (大文字または小文字)
  • 数字 (0-9)
  • アンダースコア (_)
  • ダッシュ (-)
  • ポイント(.)
  • スペースやその他の文字は使用しないでください。

いくつかの例を示します。

  • OK: "screen123.css"。
  • OK: "screen-new-file.css"。
  • OK: "screen_new.js"。
  • NOT OK: "スクリーン新しいファイル.css"。

give文字列に上記以外の文字が含まれている場合にエラーを投げる必要があるので、このための正規表現が必要なのだと思います。

どのように解決するのですか?

必要なパターンは、次のようなものです ( rubular.comでご覧ください。 ):

^[a-zA-Z0-9_.-]*$

説明する。

  • ^ はラインアンカーの始点
  • $ は行末のアンカー
  • [...] は文字クラス定義
  • * はゼロまたはそれ以上の繰り返しです。

なお、リテラルダッシュの - は文字クラス定義の最後の文字であり、それ以外は別の意味(つまり範囲)を持つ。そのため . も、文字クラス定義の外では別の意味を持ちますが、内部では単なるリテラルな .

参考文献


PHPの場合

このパターンの使い方を示すスニペットを以下に示します。

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

上記のプリントは、( ideone.comで見たように ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

パターンが少し違うことに注意してください。 \w の代わりに これは、quot;word character"を表す文字クラスです。

APIリファレンス


仕様に関する注意事項

これは、あなたの仕様に従っているように見えますが、これは以下のようなものにマッチすることに注意してください。 ..... などがありますが、これはあなたが望むことであってもなくてもかまいません。どのようなパターンにマッチさせたいかをもっと具体的に説明できれば、正規表現は少し複雑になります。

上記の正規表現は、空文字列にもマッチします。少なくとも一文字が必要な場合は + (ワンオアモア)の代わりに * (ゼロまたはそれ以上)の繰り返しになります。

いずれにせよ、あなたの仕様をさらに明確にすることができます(正規表現の質問をするときはいつも役立ちます)が、上記の情報があれば、自分でパターンを書く方法を学ぶこともできると思います。