質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

2238閲覧

正規表現の解読ができず困っております

9nom

総合スコア42

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2017/08/08 13:18

REGEXP_MATCH([ページ],'^(?=./aaaa/[a-z]+/)(?!./aaaa/[a-z]/[0-9]/)(?!.?)(?!./aaaa/[a-z]/dddd/).')=TRUE THEN 'Aグループ'

という正規表現があってはっきりと解読できず困っております。作成者がすでにおらず、どのようなことを意図して作成したのかわかりません。お助けくだされ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

正規表現の解読には次のようなサイトが便利です。
https://regex101.com/

では、解読していきましょう。


^
行頭


(?=.*/aaaa/[a-z]+/)
肯定先読み(=直後に現れる位置でマッチ)で次の順で表されるパターン

  1. 任意の文字が 0 文字以上
  2. 文字列 /aaaa/
  3. a-zの範囲内の文字が 1 文字以上

(?!.*/aaaa/[a-z]*/[0-9]*/)
否定先読み(=直後に現れない位置でマッチ)で次の順で表されるパターン

  1. 任意の文字が 0 文字以上
  2. 文字列 /aaaa/
  3. a-zの範囲内の文字が 0 文字以上
  4. 文字列 /
  5. 0-9の範囲内の文字が 0 文字以上
  6. 文字列 /

(?!.*\?)
否定的先読み(=直後に現れない位置でマッチ)で次の順で表されるパターン

  1. 任意の文字が 0 文字以上
  2. 文字列 ?

(?!.*/aaaa/[a-z]*/dddd/)
否定的先読み(=直後に現れない位置でマッチ)で次の順で表されるパターン

  1. 任意の文字が 0 文字以上
  2. 文字列 /aaaa/
  3. a-zの範囲内の文字が 0 文字以上
  4. 文字列 /dddd/

.* - 0 文字以上の繰り返し


この正規表現は肯定先読みになっている部分に、それに続く否定先読みの部分が続かないパターンの文字列がマッチします。

ヒットする例)

x/aaaa/x/ /aaaa/x/ /aaaa/x/y /aaaa/x/y/z /aaaa/x/y/aaaa// /aaaa/x/y/aaaa/z/z/ /aaaa/x/y/aaaa/x/ddd/

ヒットしない例)

/aaaa/x/y/aaaa/// /aaaa/x/y/aaaa/z/0/ /aaaa/x/? /aaaa/x/y? /aaaa/x/y/z? /aaaa/x/aaaa/? /aaaa/x/aaaa/y? /aaaa/x/aaaa/y/z? /aaaa/x/y/aaaa/x/dddd/

投稿2017/08/08 14:08

chitoku

総合スコア1610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(?=)は肯定先読み、(?!)は否定先読みなので

  • (?=.*/aaaa/[a-z]+/)→「/aaaa/」の後ろにa~zが1文字以上あって「/」が付く文字列にヒットし

ただし・・・

  • (?!./aaaa/[a-z]/[0-9]*/)→その後ろに数字+「/」が続かず
  • (?!.*?)→「?」が出現せず、
  • (?!./aaaa/[a-z]/dddd/).*')→「/dddd/」と続かないもの

にヒットさせます

sample

とりあえずPHPでsampleつけておきます
※文字列にスラッシュを含むのでデリミタは|にしてあります

PHP

1check("aaaa/xyz/"); //→aaaaの前にスラッシュがないのでNG 2check("/aaaa/xyz"); //→aaaaの後の英字の後にスラッシュがないのでNG 3check("/aaaa/xyz/"); //→マッチするのでOK 4check("xxx/aaaa/xyz/"); //→/aaaaの前に文字があってもOK 5check("xxx/aaaa/xyz123/"); //→/aaaa/の直後に英字以外がきてスラッシュで閉じるとNG 6check("xxx/aaaa/abc/123/"); //→/aaaa/の直後に英字がきてスラッシュ、その後数字だけがきてスラッシュで閉じるとNG 7check("xxx/aaaa/abc/a123/"); //→数字だけじゃなければOK 8check("xxx/aaaa/abc/ddd/"); //→ddd/はOK 9check("xxx/aaaa/abc/dddd/"); //→dddd/はNG 10check("xxx/aaaa/abc/ddddd/"); //→ddddd/はOK 11 12function check($str){ 13 $pattern="|^(?=.*/aaaa/[a-z]+/)(?!.*/aaaa/[a-z]*/[0-9]*/)(?!.*\?)(?!.*/aaaa/[a-z]*/dddd/).*|"; 14 print $str.":".( preg_match($pattern,$str)?"ok":"ng")."<br>\n"; 15}

投稿2017/08/08 13:56

編集2017/08/08 14:16
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2017/08/08 14:38

面白いですね、これ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問