REGEXP_MATCH([ページ],'^(?=./aaaa/[a-z]+/)(?!./aaaa/[a-z]/[0-9]/)(?!.?)(?!./aaaa/[a-z]/dddd/).')=TRUE THEN 'Aグループ'
という正規表現があってはっきりと解読できず困っております。作成者がすでにおらず、どのようなことを意図して作成したのかわかりません。お助けくだされ
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
正規表現の解読には次のようなサイトが便利です。
https://regex101.com/
では、解読していきましょう。
^
行頭
(?=.*/aaaa/[a-z]+/)
肯定先読み(=直後に現れる位置でマッチ)で次の順で表されるパターン
- 任意の文字が 0 文字以上
- 文字列
/aaaa/
a
-z
の範囲内の文字が 1 文字以上
(?!.*/aaaa/[a-z]*/[0-9]*/)
否定先読み(=直後に現れない位置でマッチ)で次の順で表されるパターン
- 任意の文字が 0 文字以上
- 文字列
/aaaa/
a
-z
の範囲内の文字が 0 文字以上- 文字列
/
0
-9
の範囲内の文字が 0 文字以上- 文字列
/
(?!.*\?)
否定的先読み(=直後に現れない位置でマッチ)で次の順で表されるパターン
- 任意の文字が 0 文字以上
- 文字列
?
(?!.*/aaaa/[a-z]*/dddd/)
否定的先読み(=直後に現れない位置でマッチ)で次の順で表されるパターン
- 任意の文字が 0 文字以上
- 文字列
/aaaa/
a
-z
の範囲内の文字が 0 文字以上- 文字列
/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
総合スコア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総合スコア114572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。