ćŸŒæ–č揂照

æ–‡ć­—ă‚Żăƒ©ă‚čć€–ă§ă€ăƒăƒƒă‚Żă‚čăƒ©ăƒƒă‚·ăƒ„ă«ç¶šă„ăŠ 1 ä»„äžŠăźæ•°ć€€ïŒˆè€‡æ•°æĄćŻïŒ‰ ă‚’èš˜èż°ă—ăŸă‚‚ăźăŻă€ăƒ‘ă‚żăƒŒăƒłäž­ăźă‚ˆă‚Šć‰æ–čïŒˆă™ăȘă‚ăĄć·ŠïŒ‰ă«ă‚ă‚‹ ă‚­ăƒŁăƒ—ăƒăƒŁç”šă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłă«ćŻŸă™ă‚‹ćŸŒæ–č揂照 (back reference) です。ただし、 ăăźć·Šæ–čă«ă€ăăźæ•°ć€€ä»„äžŠăźć€‹æ•°ăźă‚­ăƒŁăƒ—ăƒăƒŁç”šă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăźé–‹ăă‚«ăƒƒă‚łăŒ ă‚ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ă€‚

ăȘお、バックă‚čăƒ©ăƒƒă‚·ăƒ„ăźćŸŒă« 10 æœȘæș€ăź 10 é€Čæ•°ăŒç¶šăć ŽćˆăŻ ćžžă«ćŸŒæ–čć‚ç…§ăšă—ăŠè§Łé‡ˆă•ă‚Œă€ăƒ‘ă‚żăƒŒăƒłć…šäœ“ă§æŒ‡ćźšă—ăŸć€‹æ•°ä»„äžŠăź ă‚­ăƒŁăƒ—ăƒăƒŁç”šă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŒç„Ąă„ăšă‚šăƒ©ăƒŒăŒç™șç”Ÿă—ăŸă™ă€‚èš€ă„ă‹ăˆă‚‹ăšă€ ć‚ç…§ă•ă‚Œă‚‹ă‚«ăƒƒă‚łăŻă€10æœȘæș€ăźç•Șć·ă«ćŻŸă—ăŠăŻă€ć‚ç…§ă™ă‚‹ćŽăźć·Šă«ă‚ă‚‹ćż…èŠăŒăȘいべいうこべです。 "才æ–čă«ă‚ă‚‹ćŸŒæ–č揂照 (forward back reference)" ăŒæ„ć‘łă‚’ăȘすぼは、 çč°ă‚Šèż”ă—ăŒć«ăŸă‚ŒăŠă„ăŠă€ćłćŽăžăźă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŒăăźć‰ăźććŸ©ă«ć«ăŸă‚ŒăŠă„ă‚‹ć Žćˆă§ă™ă€‚ バックă‚čăƒ©ăƒƒă‚·ăƒ„ăźćŸŒă«æ•°ć­—ăŒç¶šăć Žćˆăźć‡Šç†ăźè©łçŽ°ă«ă€ă„ăŠăŻă€ スă‚čă‚±ăƒŒăƒ—ă‚·ăƒŒă‚±ăƒłă‚č ăźă‚»ă‚Żă‚·ăƒ§ăƒłă‚’ć‚ç…§ăă ă•ă„ă€‚

ćŸŒæ–čć‚ç…§ăŻă€ă‚«ăƒŹăƒłăƒˆăźćŻŸè±Ąæ–‡ć­—ćˆ—ă«ăŠă„ăŠă‚­ăƒŁăƒ—ăƒăƒŁç”šă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŒ ćźŸéš›ă«ăƒžăƒƒăƒă—ăŸæ–‡ć­—ćˆ—ă«ăƒžăƒƒăƒă—ăŸă™ă€‚ă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŒăƒ‘ă‚żăƒŒăƒłăšă—ăŠ ăƒžăƒƒăƒă—ćŸ—ă‚‹ă‚‚ăźă§ăŻă‚ă‚ŠăŸă›ă‚“ă€‚ă™ăȘă‚ăĄă€ăƒ‘ă‚żăƒŒăƒł

      (sens|respons)e and \1ibility
      
は、"sense and sensibility" および "response and responsibility" ă«ăƒžăƒƒăƒă—ăŸă™ăŒă€ "sense and responsibility" ă«ăŻăƒžăƒƒăƒă—ăŸă›ă‚“ă€‚ăŸăŸă€ ćŸŒæ–čć‚ç…§ăŒèš˜èż°ă•ă‚ŒăŠă„ă‚‹äœçœźă§ć€§ć°æ–‡ć­—ă‚’ćŒșćˆ„ă™ă‚‹ăƒžăƒƒăƒăƒłă‚°ăŒæœ‰ćŠčăȘらば、 æ–‡ć­—ăźć€§ć°æ–‡ć­—ăźćˆ„ă‚‚é–ąäż‚ă—ăŸă™ă€‚äŸ‹ăˆă°ă€
      ((?i)rah)\s+\1
      
は、"rah rah" および "RAH RAH" ă«ăƒžăƒƒăƒă—ăŸă™ăŒă€ ć…ƒăźă‚­ăƒŁăƒ—ăƒăƒŁç”šă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŻć€§ć°æ–‡ć­—ă‚’ćŒșćˆ„ă—ăȘいマッチングを èĄŒăŁăŠă„ă‚‹ă«ă‚‚ă‹ă‹ă‚ă‚‰ăšă€"RAH rah" ă«ăŻăƒžăƒƒăƒă—ăŸă›ă‚“

ćŒă˜ă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłă«ćŻŸă—ăŠă€è€‡æ•°ć›žăźćŸŒæ–čć‚ç…§ă‚’èĄŒă†ă“ăšăŒă§ăăŸă™ă€‚ ăŸăŸă€äœżă‚ă‚ŒăȘă‹ăŁăŸă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłă«ćŻŸă™ă‚‹ćŸŒæ–čć‚ç…§ă‚’èĄŒăŠă†ăšă™ă‚‹ăšă€ ăƒžăƒƒăƒăŒć€±æ•—ă—ăŸă™ă€‚äŸ‹ăˆă°ă€ăƒ‘ă‚żăƒŒăƒł

      (a|(bc))\2
      
ăŻă€ăŻă˜ă‚ă« "bc" でăȘく "a" ă«ăƒžăƒƒăƒă—ăŸć ŽćˆăŻă€ăƒžăƒƒăƒăŒć€±æ•—ă—ăŸă™ă€‚ æœ€ć€§ 99 ç•ȘăŸă§ăźćŸŒæ–čć‚ç…§ă‚’äœżç”šă§ăă‚‹ăŸă‚ă€ăƒăƒƒă‚Żă‚čăƒ©ăƒƒă‚·ăƒ„ăźćŸŒă« æ•°ć­—ăŒç¶šăă‚‚ăźăŻă™ăčăŠćŸŒæ–č揂照ç•Șć·ăźćŻèƒœæ€§ăŒă‚ă‚‹ă‚‚ăźăšă—ăŠè§Łé‡ˆă•ă‚ŒăŸă™ă€‚ ćŸŒă«æ•°ć­—ăŒç¶šăć Žćˆă€ćŸŒæ–čć‚ç…§ă‚’ç”‚äș†ă™ă‚‹ăŸă‚ă«ăȘんらかぼćŒșćˆ‡ă‚Šæ–‡ć­—ă‚’ çœźăćż…èŠăŒă‚ă‚ŠăŸă™ă€‚PCRE_EXTENDED ă‚Șăƒ—ă‚·ăƒ§ăƒłă‚’èš­ćźšă—ăŠă„ă‚‹ć ŽćˆăŻç©șç™œæ–‡ć­—ă‚’ćŒșćˆ‡ă‚Šæ–‡ć­—ăšă—ăŠäœżăˆăŸă™ă€‚ ăăźä»–ăźć ŽćˆăŻç©șăźă‚łăƒĄăƒłăƒˆă‚’äœżă„ăŸă™ă€‚

ćŸŒæ–č揂照を、それè‡Șèș«ăŒć‚ç…§ă™ă‚‹ă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăźă‚«ăƒƒă‚łć†…ă«èš˜èż°ă—ăŸć Žćˆă€ ăăźă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŒæœ€ćˆă«äœżă‚ă‚ŒăŸéš›ă«ăƒžăƒƒăƒăŒć€±æ•—ă—ăŸă™ă€‚ă§ă™ăźă§ă€ (a\1) ăŻă€äœ•ă«ă‚‚ăƒžăƒƒăƒă—ăŸă›ă‚“ă€‚ă—ă‹ă—ă€ă“ăźă‚ˆă†ăȘ揂照は、 è€‡æ•°ć›žçč°ă‚Šèż”ă•ă‚Œă‚‹ă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăźć†…éƒšă§ăŻæœ‰ç”šă§ă™ă€‚äŸ‹ăˆă°ă€ăƒ‘ă‚żăƒŒăƒł

      (a|b\1)+
      
は、"a" ăŒé€Łç¶šă™ă‚‹ă‚‚ăźă‚„ "aba", "ababba" ç­‰ă«ăƒžăƒƒăƒă—ăŸă™ă€‚ ă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăŒçč°ă‚Šèż”ă•ă‚Œă‚‹ć Žćˆă€ćŸŒæ–č揂照は、目才ぼçč°ă‚Šèż”ă—ă§äž€è‡Žă—ăŸ æ–‡ć­—ćˆ—ă«ăƒžăƒƒăƒă—ăŸă™ă€‚ă“ă†ă—ăŸăƒ‘ă‚żăƒŒăƒłă‚’ć‹•äœœă•ă›ă‚‹ăŸă‚ă«ăŻă€ çč°ă‚Šèż”した1 ć›žç›źă«ă€ćŸŒæ–čć‚ç…§ă‚’ć«ă‚€ăƒ‘ă‚żăƒŒăƒłăšăźăƒžăƒƒăƒăƒłă‚°ăŒ èĄŒă‚ă‚ŒăȘă„ă“ăšăŒćż…èŠă§ă™ă€‚ă“ă‚Œă«ăŻă€äžŠăźäŸ‹ăźă‚ˆă†ă«éžæŠžè‚ąă‚’äœżă†ă‹ă€ 例限が 0 ć›žăźé‡æŒ‡ćźšć­ă‚’äœżă„ăŸă™ă€‚

スă‚čă‚±ăƒŒăƒ—ă‚·ăƒŒă‚±ăƒłă‚č \g ă‚’äœżăŁăŠă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăźç”¶ćŻŸć‚ç…§ăŠă‚ˆăłç›žćŻŸć‚ç…§ă‚’èĄŒă†ă“ăšăŒă§ăăŸă™ă€‚ こぼスă‚čă‚±ăƒŒăƒ—ă‚·ăƒŒă‚±ăƒłă‚čăźćŸŒă«ăŻçŹŠć·ăȘă—ăźæ•°ć€€ă‚ă‚‹ă„ăŻèČ ăźæ•°ć€€ă‚’ç¶šă‘ăȘければăȘă‚ŠăŸă›ă‚“ă€‚ æ•°ć€€ăŻæłąæ‹ŹćŒ§ă§ć›Čă‚€ă“ăšă‚‚ă§ăăŸă™ă€‚\1 ず \g1 および \g{1} は、 すăčăŠćŒă˜æ„ć‘łă«ăȘă‚ŠăŸă™ă€‚çŹŠć·ăȘă—æ•°ć€€ă§ă“ăźæ–čćŒă‚’äœżăˆă°ă€ バックă‚čăƒ©ăƒƒă‚·ăƒ„ăźćŸŒă«æ•°ć€€ă‚’ç¶šă‘ă‚‹æ–čćŒăŒă‚‚ă€ă‚ă„ăŸă„ă•ă‚’æŽ’é™€ă§ăăŸă™ă€‚ こぼæ–čćŒă‚’äœżăˆă°ćŸŒæ–čć‚ç…§ăšć…«é€Čæ•°ć€€ă‚’æ˜ŽçąșにćŒșćˆ„ă™ă‚‹ă“ăšăŒă§ăă€ ă•ă‚‰ă«ă€ćŸŒæ–čć‚ç…§ăźă‚ăšă«æ•°ć€€ăƒȘăƒ†ăƒ©ăƒ«ăŒç¶šă \g{2}1 ぼようăȘăƒ‘ă‚żăƒŒăƒłă‚‚æ›žăă‚„ă™ăăȘă‚ŠăŸă™ă€‚

\g ă‚·ăƒŒă‚±ăƒłă‚čでèČ ăźæ•°ć€€ă‚’äœżă†ăšă€ ăă‚ŒăŻç›žćŻŸć‚ç…§ă‚’èĄšă—ăŸă™ă€‚ăŸăšăˆă° (foo)(bar)\g{-1} は "foobarbar" ă«ăƒžăƒƒăƒă—ă€(foo)(bar)\g{-2} は "foobarfoo" ă«ăƒžăƒƒăƒă—ăŸă™ă€‚ ă“ă‚ŒăŻă€é•·ă„ăƒ‘ă‚żăƒŒăƒłăźäž­ă§ç‰čćźšăźă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłă‚’ć‚ç…§ă™ă‚‹ć Žćˆă«äŸżćˆ©ă§ă™ă€‚ ăă‚ŒăŒäœ•ç•Șç›źăźă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłă«ăȘă‚‹ă‹ă‚’ă„ăĄă„ăĄèŠšăˆăŠăŠăă‹ă‚ă‚Šă«ă€ ç›žćŻŸæŒ‡ćźšă™ă‚‹ă“ăšăŒă§ăă‚‹ă‹ă‚‰ă§ă™ă€‚

ćć‰ă‚’æŒ‡ćźšă—ăŸă‚”ăƒ–ăƒ‘ă‚żăƒŒăƒłăžăźćŸŒæ–čć‚ç…§ă‚’èĄŒă†ă«ăŻ (?P=name) ăšă—ăŸă™ă€‚ ă“ă‚Œä»„ć€–ă«ă‚‚ \k<name>, \k'name', \k{name}, \g{name}, \g<name>, \g'name' ăźćœąă‚‚äœżăˆăŸă™ă€‚

add a note

User Contributed Notes 2 notes

up
13
mnvx at yandex dot ru ¶
9 years ago
Something similar opportunity is DEFINE.

Example:
    (?(DEFINE)(?<myname>\bvery\b))(?&myname)\p{Pd}(?&myname).

Expression above will match "very-very" from next sentence:
    Define is very-very handy sometimes.
              ^-------^

How it works. (?(DEFINE)(?<myname>\bvery\b)) - this block defines "myname" equal to "\bvery\b". So, this block "(?&myname)\p{Pd}(?&myname)" equvivalent to "\bvery\b\p{Pd}\bvery\b".
up
1
Steve ¶
3 years ago
The escape sequence \g used as a backreference may not always behave as expected.
The following numbered backreferences refer to the text matching the specified capture group, as documented:
\1
\g1
\g{1}
\g-1
\g{-1}

However, the following variants refer to the subpattern code instead of the matched text:
\g<1>
\g'1'
\g<-1>
\g'-1'

With named backreferences, we may also use the \k escape sequence as well as the (?P=...) construct. The following combinations also refer to the text matching the named capture group, as documented:
\g{name}
\k{name}
\k<name>
\k'name'
(?P=name)

However, these refer to the subpattern code instead of the matched text:
g<name>
\g'name'

In the following example, the capture group searches for a single letter 'a' or 'b', and then the backreference looks for the same letter. Thus, the patterns are expected to match 'aa' and 'bb', but not 'ab' nor 'ba'.

<?php
/* Matches to the following patterns are replaced by 'xx' in the subject string 'aa ab ba bb'. */
$patterns = [
  # numbered backreferences (absolute)
  '/([ab])\1/',      // 'xx ab ba xx'
  '/([ab])\g1/',     // 'xx ab ba xx'
  '/([ab])\g{1}/',   // 'xx ab ba xx'
  '/([ab])\g<1>/',   // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  "/([ab])\g'1'/",   // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  '/([ab])\k{1}/',   // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
  '/([ab])\k<1>/',   // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
  "/([ab])\k'1'/",   // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
  '/([ab])(?P=1)/',  // NULL # Regex error: "subpattern name must start with a non-digit", (?P=) expects name not number.
  # numbered backreferences (relative)
  '/([ab])\-1/',     // 'aa ab ba bb'
  '/([ab])\g-1/',    // 'xx ab ba xx'
  '/([ab])\g{-1}/',  // 'xx ab ba xx'
  '/([ab])\g<-1>/',  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  "/([ab])\g'-1'/",  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  '/([ab])\k{-1}/',  // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
  '/([ab])\k<-1>/',  // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
  "/([ab])\k'-1'/",  // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
  '/([ab])(?P=-1)/', // NULL # Regex error: "subpattern name expected", (?P=) expects name not number.
  # named backreferences
  '/(?<name>[ab])\g{name}/',  // 'xx ab ba xx'
  '/(?<name>[ab])\g<name>/',  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  "/(?<name>[ab])\g'name'/",  // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
  '/(?<name>[ab])\k{name}/',  // 'xx ab ba xx'
  '/(?<name>[ab])\k<name>/',  // 'xx ab ba xx'
  "/(?<name>[ab])\k'name'/",  // 'xx ab ba xx'
  '/(?<name>[ab])(?P=name)/', // 'xx ab ba xx'
];
    
foreach ($patterns as $pat)
    echo "  '$pat',\t// " . var_export(@preg_replace($pat, 'xx', 'aa ab ba bb'), 1) . PHP_EOL;
?>