ๅ†่ฉฆ่กŒ็„กใ—ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณ

็นฐใ‚Š่ฟ”ใ—ๅ›žๆ•ฐใฎไธ‹้™ใ‚‚ใ—ใใฏไธŠ้™ใฎๆŒ‡ๅฎšใ‚’ใ—ใŸๅ ดๅˆใ€ ใ€”็นฐใ‚Š่ฟ”ใ—ใ‚’ๆŒ‡ๅฎšใ—ใŸ่ฆ็ด ใฎใ€•็ถšใใŒใƒžใƒƒใƒใซๅคฑๆ•—ใ™ใ‚‹ใจใ€ ็นฐใ‚Š่ฟ”ใ—ๆŒ‡ๅฎšใ—ใŸ่ฆ็ด ใŒๅ†่ฉ•ไพกใ•ใ‚Œใ€็นฐใ‚Š่ฟ”ใ—ๅ›žๆ•ฐใ‚’ๅค‰ใˆใŸไธŠใง ๆฎ‹ใ‚Šใฎใƒ‘ใ‚ฟใƒผใƒณใŒใƒžใƒƒใƒใ™ใ‚‹ใ‹ใฉใ†ใ‹่ฉฆใ•ใ‚Œใพใ™ใ€‚ ใƒžใƒƒใƒใƒณใ‚ฐใ‚’็ถšใ‘ใฆใ‚‚็„ก้ง„ใชใ“ใจใŒๆ˜Žใ‚‰ใ‹ใชๅ ดๅˆใ€ใƒžใƒƒใƒใƒณใ‚ฐใฎๆ€ง่ณชใ‚’ๅค‰ใˆใ€ ใ‚ˆใ‚Š้€Ÿใใƒžใƒƒใƒใซๅคฑๆ•—ใ•ใ›ใ‚‹ใŸใ‚ใซใ€ใ“ใ†ใ—ใŸๅ‹•ไฝœใ‚’ๅœๆญขใ•ใ›ใ‚‹ใ“ใจใŒ ๆœ‰็”จใชๅ ดๅˆใŒใ‚ใ‚Šใพใ™ใ€‚

ไพ‹ใˆใฐใ€ใƒ‘ใ‚ฟใƒผใƒณ \d+foo ใ‚’ "123456bar" ใจใ„ใ†ๅฏพ่ฑกๆ–‡ๅญ—ๅˆ—ใซ้ฉ็”จใ—ใŸๅ ดๅˆใ‚’่€ƒใˆใฆใฟใพใ—ใ‚‡ใ†ใ€‚

\d+ ใŒ 6 ๆกใฎๆ•ฐๅญ—ใ™ในใฆใซใƒžใƒƒใƒใ—ใพใ™ใŒใ€ใใฎๅพŒ "foo" ใจใฎใƒžใƒƒใƒใŒๅคฑๆ•—ใ—ใพใ™ใ€‚้€šๅธธใฎใƒžใƒƒใƒใƒณใ‚ฐๅ‡ฆ็†ใฎๅ‹•ไฝœใ ใจใ€5ๆกใฎๆ•ฐๅญ—ใฎใฟใŒ \d+ ใซใƒžใƒƒใƒใ™ใ‚‹ใจใ—ใฆๅ†่ฉฆ่กŒใ•ใ‚Œใ€ๆฌกใ„ใง 4 ๆก็ญ‰ใ€…ใจ็ถšใ‘ใ‚‰ใ‚Œใ€ ๆœ€ๅพŒใซใฏๅฎŒๅ…จใซใƒžใƒƒใƒใŒๅคฑๆ•—ใ—ใพใ™ใ€‚ๅ†่ฉฆ่กŒ็„กใ—ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณ (once-only subpattern) ใ‚’็”จใ„ใ‚‹ใจใ€ใƒ‘ใ‚ฟใƒผใƒณใฎไธ€้ƒจใŒไธ€ๅบฆใƒžใƒƒใƒใ—ใŸใ‚‰ใ€ ใใฎๅพŒๅ†่ฉ•ไพกใ•ใ‚Œใชใ„ใ‚ˆใ†ๆŒ‡ๅฎšใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ใคใพใ‚Šใ€ๆœ€ๅˆใซ "foo" ใจใฎใƒžใƒƒใƒใซๅคฑๆ•—ใ—ใŸๆ™‚็‚นใงใ€ใŸใ ใกใซใƒžใƒƒใƒใƒณใ‚ฐใ‚’ๅ–ใ‚Šๆญขใ‚ใ‚‹ใ“ใจใŒ ๅฏ่ƒฝใจใชใ‚Šใพใ™ใ€‚่กจ่จ˜ใซใฏใ€

      (?>\d+)bar
      
ใฎใ‚ˆใ†ใซใ€(?> ใงๅง‹ใพใ‚‹็‰นๅˆฅใชใ‚ซใƒƒใ‚ณใ‚’็”จใ„ใพใ™ใ€‚

ใ“ใฎ็จฎ้กžใฎใ‚ซใƒƒใ‚ณใฏใ€ไธ€ๅบฆใƒžใƒƒใƒใ—ใŸใƒ‘ใ‚ฟใƒผใƒณใฎ้ƒจๅˆ†ใซ้ตใ‚’ใ‹ใ‘ (lock up) ใพใ™ใ€‚ใใฎใƒ‘ใ‚ฟใƒผใƒณใธใฎๅ†ใƒžใƒƒใƒใฏๅคฑๆ•—ใ—ใ€ใƒใƒƒใ‚ฏใƒˆใƒฉใƒƒใ‚ฏ (backtrack) ใŒ่ตทใ“ใ‚‰ใชใ„ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ใใ‚Œใ‚ˆใ‚Šๅ‰ใฎ่ฆ็ด ใซๅฏพใ™ใ‚‹ใƒใƒƒใ‚ฏใƒˆใƒฉใƒƒใ‚ฏใฏใ€ ้€šๅธธใจๅŒๆง˜ใซๅ‹•ไฝœใ—ใพใ™ใ€‚

ๅˆฅใฎ่ชฌๆ˜Žใ‚’ใ™ใ‚‹ใจใ€ใ“ใฎใ‚ฟใ‚คใƒ—ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใฏใ€ๅŒไธ€ใฎใ‚นใ‚ฟใƒณใƒ‰ใ‚ขใƒญใƒผใƒณใฎ ใƒ‘ใ‚ฟใƒผใƒณใŒๅฏพ่ฑกๆ–‡ๅญ—ๅˆ—ใฎใ‚ซใƒฌใƒณใƒˆใฎไฝ็ฝฎใซๅ›บๅฎšใ•ใ‚ŒใŸใ‹ใฎใ‚ˆใ†ใซใ€ ๆ–‡ๅญ—ๅˆ—ใจใƒžใƒƒใƒใ—ใพใ™ใ€‚

ๅ†่ฉฆ่กŒ็„กใ—ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใฏใ€ใ‚ญใƒฃใƒ—ใƒใƒฃ็”จใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใงใฏใ‚ใ‚Šใพใ›ใ‚“ ใ€”ใคใพใ‚Šใ€ๅ€คใฎใ‚ญใƒฃใƒ—ใƒใƒฃใฏ่กŒใ‚ใ‚Œใพใ›ใ‚“ใ€•ใ€‚ไธŠใฎ็ฐกๅ˜ใชไพ‹ใงใฏใ€ ใงใใ‚‹ใ ใ‘ๅคšใใฎใ‚‚ใฎใ‚’ๅ‘‘ใฟ่พผใ‚€ใ‚ˆใ†็นฐใ‚Š่ฟ”ใ—ใŒๆœ€ๅคงๅŒ–ใ•ใ‚Œใพใ—ใŸใ€‚ใคใพใ‚Šใ€ + ใ‚„ +? ใฏๆฎ‹ใ‚Šใฎใƒ‘ใ‚ฟใƒผใƒณใŒใƒžใƒƒใƒใ™ใ‚‹ใ‚ˆใ†ๆ•ฐๅญ—ใฎๆกๆ•ฐใŒ่ชฟๆ•ดใ•ใ‚Œใ‚‹ใฎใซ ๅฏพใ—ใฆใ€ (?>+) ใฏๆ•ฐๅญ—ใฎไธฆใณๅ…จไฝ“ใซๅฏพใ™ใ‚‹ใƒžใƒƒใƒใƒณใ‚ฐใ ใ‘ใ—ใ‹่กŒใ‚ใ‚Œใพใ›ใ‚“ใ€‚

ใ“ใฎๆง‹ๆ–‡ใซใฏใ€ใฉใ‚“ใช่ค‡้›‘ใชใ‚‚ใฎใงใ‚‚ใ€ไปปๆ„ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใ‚’ๅซใ‚€ใ“ใจใŒใงใใ€ ใƒใ‚นใƒˆใ‚‚ๅฏ่ƒฝใงใ™ใ€‚

ๅ†่ฉฆ่กŒ็„กใ—ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใจๆˆปใ‚Š่ชญใฟ่จ€ๆ˜Žใจใ‚’็ต„ใฟๅˆใ‚ใ›ใ‚‹ใจใ€ ๅฏพ่ฑกๆ–‡ๅญ—ๅˆ—ใฎ็ต‚็ซฏใซใŠใ‘ใ‚‹ๅŠน็އ็š„ใชใƒžใƒƒใƒใƒณใ‚ฐใ‚’่กŒใ†ใ“ใจใŒใงใใพใ™ใ€‚

      abcd$
      
ใจใ„ใ†ใƒ‘ใ‚ฟใƒผใƒณใ‚’่ฆ‹ใฆใพใ—ใ‚‡ใ†ใ€‚ ใƒžใƒƒใƒใŒๆˆๅŠŸใ—ใชใ„้•ทใ„ๆ–‡ๅญ—ๅˆ—ใซ้ฉ็”จใ—ใŸๅ ดๅˆใ‚’่€ƒใˆใพใ™ใ€‚ ใƒžใƒƒใƒใƒณใ‚ฐใฏๅทฆใ‹ใ‚‰ๅณใซ่กŒใ‚ใ‚Œใ‚‹ใŸใ‚ใ€PCRE ใฏๅฏพ่ฑกๆ–‡ๅญ—ๅˆ—ใฎใ™ในใฆใฎ "a" ใ‚’ๆŽขใ—ใ€ ๅพŒใซ็ถšใๆ–‡ๅญ—ใŒๆฎ‹ใ‚Šใฎใƒ‘ใ‚ฟใƒผใƒณใซใƒžใƒƒใƒใ™ใ‚‹ใ‹ใฉใ†ใ‹่ชฟในใ‚‰ใ‚Œใพใ™ใ€‚ ใƒ‘ใ‚ฟใƒผใƒณใ‚’
      ^.*abcd$
      
ใฎใ‚ˆใ†ใซๅฐ‘ใ—ๅค‰ๆ›ดใ—ใฆใฟใพใ™ใ€‚ ใ“ใฎๅ ดๅˆใ€ๆœ€ๅˆใฎ .* ใฏใ€ใพใšๆ–‡ๅญ—ๅˆ—ๅ…จไฝ“ใซใƒžใƒƒใƒใ—ใพใ™ใ€‚ ๏ผˆ"a" ใŒใใฎๅพŒใซ็ถšใ‹ใชใ„ใฎใง๏ผ‰ใƒžใƒƒใƒใŒๅคฑๆ•—ใ™ใ‚‹ใจใ€ๆœ€ๅพŒใฎ 1 ๆ–‡ๅญ—ใ‚’้™คใ ๆ–‡ๅญ—ๅˆ—ใซใƒžใƒƒใƒใ™ใ‚‹ใ‚ˆใ†ใƒใƒƒใ‚ฏใƒˆใƒฉใƒƒใ‚ฏใŒ่กŒใชใ‚ใ‚Œใ€็ถšใ„ใฆๆœ€ๅพŒใฎ 2 ๆ–‡ๅญ—ใ‚’ ้™คใๆ–‡ๅญ—ๅˆ—ใซใ€ใจใ„ใ†้ขจใซๅ‹•ไฝœใ—ใพใ™ใ€‚ "a" ใฎๆคœ็ดขใฏใ€ใ‚„ใฏใ‚Šๆ–‡ๅญ—ๅˆ—ๅ…จไฝ“ใซ ๅฏพใ—ใฆใ€ๅณใ‹ใ‚‰ๅทฆใซใ€่กŒใ‚ใ‚Œใ‚‹ใŸใ‚ๅŠน็އใฏ่‰ฏใใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ใ—ใ‹ใ—ใ€ใƒ‘ใ‚ฟใƒผใƒณใ‚’
      ^(?>.*)(?<=abcd)
      
ใฎใ‚ˆใ†ใซใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚ ่ฆ็ด  .* ใซๅฏพใ—ใฆใƒใƒƒใ‚ฏใƒˆใƒฉใƒƒใ‚ฏใฏ่กŒใ‚ใ‚Œใšใ€ๆ–‡ๅญ—ๅˆ—ๅ…จไฝ“ใซใฎใฟใƒžใƒƒใƒใ—ใพใ™ใ€‚ ็ถšใๆˆปใ‚Š่ชญใฟ่จ€ๆ˜Žใฏใ€ๆœ€ๅพŒใฎ 4 ๆ–‡ๅญ—ใซๅฏพใ™ใ‚‹ใƒ†ใ‚นใƒˆใ‚’ 1 ๅ›žใ ใ‘่กŒใ„ใพใ™ใ€‚ ใƒ†ใ‚นใƒˆใŒๅคฑๆ•—ใ™ใ‚‹ใจใ€ใƒžใƒƒใƒใฏใŸใ ใกใซๅคฑๆ•—ใ—ใพใ™ใ€‚้•ทใ„ๆ–‡ๅญ—ๅˆ—ใซๅฏพใ—ใฆใฏใ€ ใ“ใฎๆ–นๆณ•ใ‚’็”จใ„ใ‚‹ใจๅฎŸ่กŒๆ™‚้–“ใซใ‹ใชใ‚ŠใฎๅทฎใŒ็”Ÿใ˜ใพใ™ใ€‚

ใƒ‘ใ‚ฟใƒผใƒณไธญใซใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใŒใ‚ใฃใฆใ€ใใฎไธญใซ็นฐใ‚Š่ฟ”ใ—ๆ•ฐใซ ไธŠ้™ใฎ็„กใ„่ฆ็ด ใŒใ‚ใ‚Šใ€ใใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณ่‡ช่บซใ‚‚ไฝ•ๅ›žใงใ‚‚็นฐใ‚Š่ฟ”ใ—ใŒ ๅฏ่ƒฝใชๅ ดๅˆใ€ใƒžใƒƒใƒใฎๅคฑๆ•—ใซ้žๅธธใซ้•ทใ„ๆ™‚้–“ใŒใ‹ใ‹ใฃใฆใ—ใพใ†ไบ‹ใŒใ‚ใ‚Šใพใ™ใ€‚ ใใ‚Œใ‚’้ฟใ‘ใ‚‹ๅ”ฏไธ€ใฎๆ–นๆณ•ใฏๅ†่ฉฆ่กŒ็„กใ—ใฎใ‚ตใƒ–ใƒ‘ใ‚ฟใƒผใƒณใ‚’ไฝฟใ†ใ“ใจใงใ™ใ€‚ ใƒ‘ใ‚ฟใƒผใƒณ

      (\D+|<\d+>)*[!?]
      
ใฏใ€้žๆ•ฐๅญ—ใ‚‚ใ—ใใฏ <> ใงๆ‹ฌใ‚‰ใ‚ŒใŸๆ•ฐๅญ—ใซ ! ใพใŸใฏ ? ใŒ็ถšใ ไปปๆ„ใฎ้•ทใ•ใฎ้ƒจๅˆ†ๆ–‡ๅญ—ๅˆ—ใซใƒžใƒƒใƒใ—ใพใ™ใ€‚ใƒžใƒƒใƒใŒๆˆๅŠŸใ™ใ‚‹ใ‚ˆใ†ใช ๅฏพ่ฑกๆ–‡ๅญ—ๅˆ—ใซๅฏพใ—ใฆใฏใ€้€Ÿใๅ‹•ไฝœใ—ใพใ™ใ€‚ ใ—ใ‹ใ—ใ€ใ“ใ‚Œใ‚’
      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      
ใซ้ฉ็”จใ™ใ‚‹ใจใ€ใƒžใƒƒใƒใŒๅคฑๆ•—ใ™ใ‚‹ใพใงใซ้•ทใ„ๆ™‚้–“ใŒใ‹ใ‹ใ‚Šใพใ™ใ€‚ใ“ใ‚Œใฏใ€ ใ“ใฎๅฏพ่ฑกๆ–‡ๅญ—ๅˆ—ใ‚’ๅˆ†ๅ‰ฒใ™ใ‚‹ใ‚„ใ‚Šๆ–นใŒๆ•ฐๅคšใใ‚ใ‚Šใ€ใใ‚Œใ‚‰ใ™ในใฆใซๅฏพใ— ใƒžใƒƒใƒใ‚’่ฉฆใฟใ‚‰ใ‚Œใ‚‹ไบ‹ใซใชใ‚‹ใŸใ‚ใงใ™ใ€‚ ๏ผˆใ“ใฎไพ‹ใงใ€็ต‚็ซฏใซๅ˜ไธ€ใฎๆ–‡ๅญ—ใงใฏใชใ [!?] ใ‚’ไฝฟใฃใฆใ„ใ‚‹ใฎใฏใ€ PCRE ใจ Perl ใฎๅŒๆ–นใจใ‚‚ใ€ใ€”็ต‚็ซฏใซใ€•ๅ˜ไธ€ใฎๆ–‡ๅญ—ใŒไฝฟใ‚ใ‚Œใ‚‹ใจใ€ ใ‚ˆใ‚Š้€Ÿใๅคฑๆ•—ใจๅˆคๅฎšใงใใ‚‹ใ‚ˆใ†ใซๆœ€้ฉๅŒ–ใŒ่กŒใ‚ใ‚Œใ‚‹ ใ€”ใฎใงใ€ใใ‚Œใ‚’้ฟใ‘ใ‚‹ใ€•ใŸใ‚ใงใ™ใ€‚ใƒžใƒƒใƒใซๅฟ…่ฆใชๆœ€ๅพŒใฎไธ€ๆ–‡ๅญ—ใŒ่จ˜ๆ†ถใ•ใ‚Œใ€ ๆ–‡ๅญ—ๅˆ—ใซใใฎๆ–‡ๅญ—ใŒ็„กใ„ๅ ดๅˆใ€ๆ—ฉๆœŸใซๅคฑๆ•—ใจๅˆคๅฎšใ•ใ‚Œใพใ™ใ€‚๏ผ‰ ใ“ใฎใƒ‘ใ‚ฟใƒผใƒณใ‚’
      ((?>\D+)|<\d+>)*[!?]
      
ใฎใ‚ˆใ†ใซๅค‰ๆ›ดใ—ใŸๅ ดๅˆใ€้žๆ•ฐๅญ—ใฎ้ƒจๅˆ†ใŒๅˆ†ๅ‰ฒใ•ใ‚Œใ‚‹ใ“ใจใŒใชใใชใ‚‹ใฎใงใ€ ใ‚ˆใ‚Š้€ŸใใƒžใƒƒใƒใŒๅคฑๆ•—ใ™ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚
๏ผ‹add a note

User Contributed Notes 1 note

up
5
Anonymous ยถ
3 years ago
Never put a "once-only subpattern" (?>...) in a "one-line" comment (#, //).
I spent almost 1 day to fix it.
Use a 'C' style comment instead !

PHP Manual says, a "one-line" comment (# , //) ends just before "?>" (PHP end tag).

These letters "?>" in a "one-line" comment (# , //) seems evaluated as a PHP end tag.

<?php

/*    (?> */
echo '"C" style comment works !<br>';

#    (?>
echo '"one-line" comment';

?>