<html>
<head>
<title>pcre2_substitute specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre2_substitute man page</h1>
<p>
Return to the <a href="index.html">PCRE2 index page</a>.
</p>
<p>
This page is part of the PCRE2 HTML documentation. It was generated
automatically from the original man page. If there is any nonsense in it,
please consult the man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre2.h&#62;</b>
</P>
<P>
<b>int pcre2_substitute(const pcre2_code *<i>code</i>, PCRE2_SPTR <i>subject</i>,</b>
<b>  PCRE2_SIZE <i>length</i>, PCRE2_SIZE <i>startoffset</i>,</b>
<b>  uint32_t <i>options</i>, pcre2_match_data *<i>match_data</i>,</b>
<b>  pcre2_match_context *<i>mcontext</i>, PCRE2_SPTR <i>replacement</i>,</b>
<b>  PCRE2_SIZE <i>rlength</i>, PCRE2_UCHAR *<i>outputbuffer</i>,</b>
<b>  PCRE2_SIZE *<i>outlengthptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function matches a compiled regular expression against a given subject
string, using a matching algorithm that is similar to Perl's. It then makes a
copy of the subject, substituting a replacement string for what was matched.
Its arguments are:
<pre>
  <i>code</i>          Points to the compiled pattern
  <i>subject</i>       Points to the subject string
  <i>length</i>        Length of the subject string
  <i>startoffset</i>   Offset in the subject at which to start matching
  <i>options</i>       Option bits
  <i>match_data</i>    Points to a match data block, or is NULL
  <i>mcontext</i>      Points to a match context, or is NULL
  <i>replacement</i>   Points to the replacement string
  <i>rlength</i>       Length of the replacement string
  <i>outputbuffer</i>  Points to the output buffer
  <i>outlengthptr</i>  Points to the length of the output buffer
</pre>
A match data block is needed only if you want to inspect the data from the
final match that is returned in that block or if PCRE2_SUBSTITUTE_MATCHED is
set. A match context is needed only if you want to:
<pre>
  Set up a callout function
  Set a matching offset limit
  Change the backtracking match limit
  Change the backtracking depth limit
  Set custom memory management in the match context
</pre>
The <i>length</i>, <i>startoffset</i> and <i>rlength</i> values are code units,
not characters, as is the contents of the variable pointed at by
<i>outlengthptr</i>. This variable must contain the length of the output buffer
when the function is called. If the function is successful, the value is
changed to the length of the new string, excluding the trailing zero that is
automatically added.
</P>
<P>
The subject and replacement lengths can be given as PCRE2_ZERO_TERMINATED for
zero-terminated strings. The options are:
<pre>
  PCRE2_ANCHORED                     Match only at the first position
  PCRE2_ENDANCHORED                  Match only at end of subject
  PCRE2_NOTBOL                       Subject is not the beginning of a line
  PCRE2_NOTEOL                       Subject is not the end of a line
  PCRE2_NOTEMPTY                     An empty string is not a valid match
  PCRE2_NOTEMPTY_ATSTART             An empty string at the start of the subject is not a valid match
  PCRE2_NO_JIT                       Do not use JIT matching
  PCRE2_NO_UTF_CHECK                 Do not check for UTF validity in the subject or replacement
                                      (only relevant if PCRE2_UTF was set at compile time)
  PCRE2_SUBSTITUTE_EXTENDED          Do extended replacement processing
  PCRE2_SUBSTITUTE_GLOBAL            Replace all occurrences in the subject
  PCRE2_SUBSTITUTE_LITERAL           The replacement string is literal
  PCRE2_SUBSTITUTE_MATCHED           Use pre-existing match data for first match
  PCRE2_SUBSTITUTE_OVERFLOW_LENGTH   If overflow, compute needed length
  PCRE2_SUBSTITUTE_REPLACEMENT_ONLY  Return only replacement string(s)
  PCRE2_SUBSTITUTE_UNKNOWN_UNSET     Treat unknown group as unset
  PCRE2_SUBSTITUTE_UNSET_EMPTY       Simple unset insert = empty string
</pre>
If PCRE2_SUBSTITUTE_LITERAL is set, PCRE2_SUBSTITUTE_EXTENDED,
PCRE2_SUBSTITUTE_UNKNOWN_UNSET, and PCRE2_SUBSTITUTE_UNSET_EMPTY are ignored.
</P>
<P>
If PCRE2_SUBSTITUTE_MATCHED is set, <i>match_data</i> must be non-NULL; its
contents must be the result of a call to <b>pcre2_match()</b> using the same
pattern and subject.
</P>
<P>
The function returns the number of substitutions, which may be zero if there
are no matches. The result may be greater than one only when
PCRE2_SUBSTITUTE_GLOBAL is set. In the event of an error, a negative error code
is returned.
</P>
<P>
There is a complete description of the PCRE2 native API in the
<a href="pcre2api.html"><b>pcre2api</b></a>
page and a description of the POSIX API in the
<a href="pcre2posix.html"><b>pcre2posix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE2 index page</a>.
</p>
