Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
PCREPARTIAL(3)		    Library Functions Manual		  PCREPARTIAL(3)

NAME
     PCRE - Perl-compatible regular expressions

PARTIAL MATCHING IN PCRE
     In  normal  use of PCRE, if the subject string that is passed to a matching
     function matches as far as it goes, but is too short to  match  the  entire
     pattern,  PCRE_ERROR_NOMATCH  is returned. There are circumstances where it
     might be helpful to distinguish this case from other cases in  which  there
     is no match.

     Consider,	for example, an application where a human is required to type in
     data for a field with specific formatting requirements. An example might be
     a date in the form ddmmmyy, defined by this pattern:

       ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$

     If the application sees the user's keystrokes one by  one,  and  can  check
     that  what  has been typed so far is potentially valid, it is able to raise
     an error as soon as a mistake is made, by beeping and  not  reflecting  the
     character	that  has  been  typed,  for example. This immediate feedback is
     likely to be a better user interface than a check that is delayed until the
     entire string has been entered. Partial matching can also	be  useful  when
     the subject string is very long and is not all available at once.

     PCRE  supports  partial  matching	by  means  of  the PCRE_PARTIAL_SOFT and
     PCRE_PARTIAL_HARD options, which can be set when calling any of the  match-
     ing  functions.  For backwards compatibility, PCRE_PARTIAL is a synonym for
     PCRE_PARTIAL_SOFT. The essential difference  between  the	two  options  is
     whether  or  not  a  partial  match is preferred to an alternative complete
     match, though the details differ between the two types  of  matching  func-
     tion. If both options are set, PCRE_PARTIAL_HARD takes precedence.

     If  you  want to use partial matching with just-in-time optimized code, you
     must call pcre_study(), pcre16_study() or	pcre32_study() with one or  both
     of these options:

       PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
       PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE

     PCRE_STUDY_JIT_COMPILE  should also be set if you are going to run non-par-
     tial matches on the same pattern. If the appropriate JIT study mode has not
     been set for a match, the interpretive matching code is used.

     Setting a partial matching option disables two of PCRE's standard optimiza-
     tions. PCRE remembers the last literal data unit in a pattern, and abandons
     matching immediately if it is not present in the subject string. This opti-
     mization cannot be used for a subject string that	might  match  only  par-
     tially.  If  the  pattern	was  studied, PCRE knows the minimum length of a
     matching string, and does not  bother  to	run  the  matching  function  on
     shorter strings. This optimization is also disabled for partial matching.

PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()
     A	partial  match occurs during a call to pcre_exec() or pcre[16|32]_exec()
     when the end of the subject string is reached  successfully,  but	matching
     cannot  continue because more characters are needed.  However, at least one
     character in the subject must have been inspected. This character need  not
     form part of the final matched string; lookbehind assertions and the \K es-
     cape  sequence  provide ways of inspecting characters before the start of a
     matched substring. The requirement for inspecting at  least  one  character
     exists  because  an  empty string can always be matched; without such a re-
     striction there would always be a partial match of an empty string  at  the
     end of the subject.

     If  there are at least two slots in the offsets vector when a partial match
     is returned, the first slot is set to the offset of the earliest  character
     that was inspected. For convenience, the second offset points to the end of
     the  subject  so that a substring can easily be identified. If there are at
     least three slots in the offsets vector, the third slot is set to the  off-
     set of the character where matching started.

     For  the  majority  of  patterns, the contents of the first and third slots
     will be the same. However, for patterns that contain lookbehind assertions,
     or begin with \b or \B, characters before the one	where  matching  started
     may have been inspected while carrying out the match. For example, consider
     this pattern:

       /(?<=abc)123/

     This  pattern  matches  "123",  but only if it is preceded by "abc". If the
     subject string is "xyzabc12", the first two offsets after a  partial  match
     are for the substring "abc12", because all these characters were inspected.
     However,  the  third  offset  is set to 6, because that is the offset where
     matching began.

     What happens when a partial match is identified depends on which of the two
     partial matching options are set.

   PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()
     If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec()  identi-
     fies a partial match, the partial match is remembered, but matching contin-
     ues  as normal, and other alternatives in the pattern are tried. If no com-
     plete match  can  be  found,  PCRE_ERROR_PARTIAL  is  returned  instead  of
     PCRE_ERROR_NOMATCH.

     This  option  is  "soft" because it prefers a complete match over a partial
     match.  All the various matching items in a pattern behave as if  the  sub-
     ject  string  is  potentially complete. For example, \z, \Z, and $ match at
     the end of the subject, as normal, and for \b and \B the end of the subject
     is treated as a non-alphanumeric.

     If there is more than one partial match, the first one that was found  pro-
     vides the data that is returned. Consider this pattern:

       /123\w+X|dogY/

     If  this  is  matched against the subject string "abc123dog", both alterna-
     tives fail to match, but the end of the subject is reached during matching,
     so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,  identi-
     fying "123dog" as the first partial match that was found. (In this example,
     there  are  two partial matches, because "dog" on its own partially matches
     the second alternative.)

   PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()
     If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), PCRE_ER-
     ROR_PARTIAL is returned as soon as a partial match is found,  without  con-
     tinuing  to search for possible complete matches. This option is "hard" be-
     cause it prefers an earlier partial match over a later complete match.  For
     this  reason,  the  assumption is made that the end of the supplied subject
     string may not be the true end of the available data, and so,  if	\z,  \Z,
     \b,  \B,  or  $  are  encountered	at the end of the subject, the result is
     PCRE_ERROR_PARTIAL, provided that at least one character in the subject has
     been inspected.

     Setting PCRE_PARTIAL_HARD also affects the way  UTF-8  and  UTF-16  subject
     strings  are checked for validity. Normally, an invalid sequence causes the
     error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However,	in  the  special
     case  of a truncated character at the end of the subject, PCRE_ERROR_SHORT-
     UTF8 or PCRE_ERROR_SHORTUTF16 is returned when PCRE_PARTIAL_HARD is set.

   Comparing hard and soft partial matching
     The difference between the two partial matching options can be  illustrated
     by a pattern such as:

       /dog(sbody)?/

     This  matches either "dog" or "dogsbody", greedily (that is, it prefers the
     longer string if possible). If it is matched against the string "dog"  with
     PCRE_PARTIAL_SOFT,  it  yields  a	complete  match  for  "dog". However, if
     PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL.  On  the  other
     hand, if the pattern is made ungreedy the result is different:

       /dog(sbody)??/

     In  this  case  the result is always a complete match because that is found
     first, and matching never continues after	finding  a  complete  match.  It
     might  be easier to follow this explanation by thinking of the two patterns
     like this:

       /dog(sbody)?/	is the same as	/dogsbody|dog/
       /dog(sbody)??/	is the same as	/dog|dogsbody/

     The second pattern will never match "dogsbody", because it will always find
     the shorter match first.

PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
     The DFA functions move along the subject  string  character  by  character,
     without backtracking, searching for all possible matches simultaneously. If
     the  end  of the subject is reached before the end of the pattern, there is
     the possibility of a partial match, again provided that at least one  char-
     acter has been inspected.

     When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there
     have  been  no  complete  matches.  Otherwise, the complete matches are re-
     turned.  However, if PCRE_PARTIAL_HARD is set, a partial match takes prece-
     dence over any complete matches. The portion of the  string  that	was  in-
     spected when the longest partial match was found is set as the first match-
     ing string, provided there are at least two slots in the offsets vector.

     Because the DFA functions always search for all possible matches, and there
     is no difference between greedy and ungreedy repetition, their behaviour is
     different	from  the standard functions when PCRE_PARTIAL_HARD is set. Con-
     sider the string "dog" matched against the ungreedy pattern shown above:

       /dog(sbody)??/

     Whereas the standard functions stop as soon as they find the complete match
     for "dog", the DFA functions also find the partial  match	for  "dogsbody",
     and so return that when PCRE_PARTIAL_HARD is set.

PARTIAL MATCHING AND WORD BOUNDARIES
     If  a  pattern  ends  with  one  of sequences \b or \B, which test for word
     boundaries, partial matching with PCRE_PARTIAL_SOFT can give  counter-intu-
     itive results. Consider this pattern:

       /\bcat\b/

     This matches "cat", provided there is a word boundary at either end. If the
     subject string is "the cat", the comparison of the final "t" with a follow-
     ing character cannot take place, so a partial match is found. However, nor-
     mal  matching carries on, and \b matches at the end of the subject when the
     last character is a letter, so a  complete  match	is  found.  The  result,
     therefore,  is not PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case
     does yield PCRE_ERROR_PARTIAL, because then the partial match takes  prece-
     dence.

FORMERLY RESTRICTED PATTERNS
     For releases of PCRE prior to 8.00, because of the way certain internal op-
     timizations  were implemented in the pcre_exec() function, the PCRE_PARTIAL
     option (predecessor of PCRE_PARTIAL_SOFT) could not be used with  all  pat-
     terns.  From  release  8.00  onwards, the restrictions no longer apply, and
     partial matching with can be requested for any pattern.

     Items that were formerly restricted were repeated single characters and re-
     peated metasequences. If PCRE_PARTIAL was set for a pattern  that	did  not
     conform  to  the restrictions, pcre_exec() returned the error code PCRE_ER-
     ROR_BADPARTIAL  (-13).  This  error  code	is  no	longer	 in   use.   The
     PCRE_INFO_OKPARTIAL  call to pcre_fullinfo() to find out if a compiled pat-
     tern can be used for partial matching now always returns 1.

EXAMPLE OF PARTIAL MATCHING USING PCRETEST
     If the escape sequence \P is present in a pcretest data line, the PCRE_PAR-
     TIAL_SOFT option is used for the match. Here is a run of pcretest that uses
     the date example quoted above:

	 re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
       data> 25jun04\P
	0: 25jun04
	1: jun
       data> 25dec3\P
       Partial match: 23dec3
       data> 3ju\P
       Partial match: 3ju
       data> 3juj\P
       No match
       data> j\P
       No match

     The first data string is matched completely, so pcretest shows the  matched
     substrings.  The  remaining four strings do not match the complete pattern,
     but the first two are partial matches. Similar output is  obtained  if  DFA
     matching is used.

     If  the  escape  sequence	\P  is present more than once in a pcretest data
     line, the PCRE_PARTIAL_HARD option is set for the match.

MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
     When a partial match has been found using a DFA matching  function,  it  is
     possible  to  continue  the  match by providing additional subject data and
     calling the function again with the same compiled regular expression,  this
     time  setting  the  PCRE_DFA_RESTART option. You must pass the same working
     space as before, because this is where  details  of  the  previous  partial
     match  are  stored.  Here is an example using pcretest, using the \R escape
     sequence to set the PCRE_DFA_RESTART option (\D specifies the  use  of  the
     DFA matching function):

	 re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
       data> 23ja\P\D
       Partial match: 23ja
       data> n05\R\D
	0: n05

     The  first  call  has "23ja" as the subject, and requests partial matching;
     the second call has "n05" as the  subject	for  the  continued  (restarted)
     match.   Notice  that  when  the  match  is complete, only the last part is
     shown; PCRE does not retain the previously partially-matched string. It  is
     up to the calling program to do that if it needs to.

     That  means that, for an unanchored pattern, if a continued match fails, it
     is not possible to try again at a new starting point. All this facility  is
     capable of doing is continuing with the previous match attempt. In the pre-
     vious  example, if the second set of data is "ug23" the result is no match,
     even though there would be a match for "aug23" if the  entire  string  were
     given  at	once.  Depending on the application, this may or may not be what
     you want.	The only way to allow for starting again at the  next  character
     is to retain the matched part of the subject and try a new complete match.

     You  can  set  the  PCRE_PARTIAL_SOFT  or	PCRE_PARTIAL_HARD  options  with
     PCRE_DFA_RESTART to continue partial matching over multiple segments.  This
     facility  can be used to pass very long subject strings to the DFA matching
     functions.

MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()
     From release 8.00, the standard matching functions can also be used  to  do
     multi-segment  matching.  Unlike  the  DFA functions, it is not possible to
     restart the previous match with a new segment of data.  Instead,  new  data
     must  be added to the previous subject string, and the entire match re-run,
     starting from the point where the partial match occurred. Earlier data  can
     be discarded.

     It  is best to use PCRE_PARTIAL_HARD in this situation, because it does not
     treat the end of a segment as the end of the subject when matching \z,  \Z,
     \b, \B, and $. Consider an unanchored pattern that matches dates:

	 re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
       data> The date is 23ja\P\P
       Partial match: 23ja

     At  this stage, an application could discard the text preceding "23ja", add
     on text from the next segment, and call the matching function again. Unlike
     the DFA matching functions, the  entire  matching	string	must  always  be
     available,  and the complete matching process occurs for each call, so more
     memory and more processing time is needed.

     Note: If the pattern contains lookbehind assertions, or \K, or starts  with
     \b  or \B, the string that is returned for a partial match includes charac-
     ters that precede the start of what would be returned for a complete match,
     because it contains all the characters that were inspected during the  par-
     tial match.

ISSUES WITH MULTI-SEGMENT MATCHING
     Certain  types  of  pattern  may give problems with multi-segment matching,
     whichever matching function is used.

     1. If the pattern contains a test for the beginning of a line, you need  to
     pass the PCRE_NOTBOL option when the subject string for any call does start
     at  the  beginning  of  a	line. There is also a PCRE_NOTEOL option, but in
     practice when doing multi-segment matching you should  be	using  PCRE_PAR-
     TIAL_HARD, which includes the effect of PCRE_NOTEOL.

     2.  Lookbehind  assertions that have already been obeyed are catered for in
     the offsets that are returned for a partial match. However a lookbehind as-
     sertion later in the pattern could require even earlier  characters  to  be
     inspected.  You  can  handle this case by using the PCRE_INFO_MAXLOOKBEHIND
     option of the pcre_fullinfo() or pcre[16|32]_fullinfo() functions to obtain
     the length of the longest lookbehind in the pattern. This length  is  given
     in  characters,  not bytes. If you always retain at least that many charac-
     ters before the partially matched string, all should be well.  (Of  course,
     near  the	start  of  the subject, fewer characters may be present; in that
     case all characters should be retained.)

     From release 8.33, there is a more accurate way of deciding  which  charac-
     ters to retain. Instead of subtracting the length of the longest lookbehind
     from  the	earliest inspected character (offsets[0]), the match start posi-
     tion (offsets[2]) should be used, and the next match attempt started at the
     offsets[2] character by setting the startoffset argument of pcre_exec()  or
     pcre_dfa_exec().

     For  example, if the pattern "(?<=123)abc" is partially matched against the
     string "xx123a", the three offset values returned are 2, 6, and 5. This in-
     dicates that the matching process that gave a partial match started at off-
     set 5, but the characters "123a" were all inspected. The maximum lookbehind
     for that pattern is 3, so taking that away from 5 shows that we  need  only
     keep  "123a",  and  the next match attempt can be started at offset 3 (that
     is, at "a") when further characters have been added. When the  match  start
     is not the earliest inspected character, pcretest shows it explicitly:

	 re> "(?<=123)abc"
       data> xx123a\P\P
       Partial match at offset 5: 123a

     3. Because a partial match must always contain at least one character, what
     might be considered a partial match of an empty string actually gives a "no
     match" result. For example:

	 re> /c(?<=abc)x/
       data> ab\P
       No match

     If  the  next  segment  begins "cx", a match should be found, but this will
     only happen if characters from the previous segment are retained. For  this
     reason,  a  "no match" result should be interpreted as "partial match of an
     empty string" when the pattern contains lookbehinds.

     4. Matching a subject string that is split into multiple segments	may  not
     always  produce  exactly  the  same result as matching over one single long
     string, especially when PCRE_PARTIAL_SOFT is  used.  The  section	"Partial
     Matching  and  Word Boundaries" above describes an issue that arises if the
     pattern ends with \b or \B. Another kind of difference may occur when there
     are multiple matching possibilities, because (for PCRE_PARTIAL_SOFT) a par-
     tial match result is given only when there are no completed  matches.  This
     means  that as soon as the shortest match has been found, continuation to a
     new subject segment is no longer possible. Consider again this pcretest ex-
     ample:

	 re> /dog(sbody)?/
       data> dogsb\P
	0: dog
       data> do\P\D
       Partial match: do
       data> gsb\R\P\D
	0: g
       data> dogsbody\D
	0: dogsbody
	1: dog

     The first data line passes the string "dogsb" to a standard matching  func-
     tion,  setting  the PCRE_PARTIAL_SOFT option. Although the string is a par-
     tial match for "dogsbody", the result is  not  PCRE_ERROR_PARTIAL,  because
     the  shorter  string "dog" is a complete match. Similarly, when the subject
     is presented to a DFA matching function in several parts  ("do"  and  "gsb"
     being  the  first two) the match stops when "dog" has been found, and it is
     not possible to continue.	On the other hand, if "dogsbody" is presented as
     a single string, a DFA matching function finds both matches.

     Because of these problems, it is best to use PCRE_PARTIAL_HARD when  match-
     ing multi-segment data. The example above then behaves differently:

	 re> /dog(sbody)?/
       data> dogsb\P\P
       Partial match: dogsb
       data> do\P\D
       Partial match: do
       data> gsb\R\P\P\D
       Partial match: gsb

     5.  Patterns  that  contain  alternatives at the top level which do not all
     start  with  the  same  pattern  item  may  not  work  as	 expected   when
     PCRE_DFA_RESTART is used. For example, consider this pattern:

       1234|3789

     If  the first part of the subject is "ABC123", a partial match of the first
     alternative is found at offset 3. There is no partial match for the  second
     alternative,  because  such a match does not start at the same point in the
     subject string. Attempting to continue with  the  string  "7890"  does  not
     yield  a  match  because only those alternatives that match at one point in
     the subject are remembered. The problem arises because  the  start  of  the
     second  alternative matches within the first alternative. There is no prob-
     lem with anchored patterns or patterns such as:

       1234|ABCD

     where no string can be a partial match for both alternatives. This is not a
     problem if a standard matching function is used, because the  entire  match
     has to be rerun each time:

	 re> /1234|3789/
       data> ABC123\P\P
       Partial match: 123
       data> 1237890
	0: 3789

     Of course, instead of using PCRE_DFA_RESTART, the same technique of re-run-
     ning the entire match can also be used with the DFA matching functions. An-
     other possibility is to work with two buffers. If a partial match at offset
     n	in  the  first buffer is followed by "no match" when PCRE_DFA_RESTART is
     used on the second buffer, you can then try a new match starting at  offset
     n+1 in the first buffer.

AUTHOR
     Philip Hazel
     University Computing Service
     Cambridge CB2 3QH, England.

REVISION
     Last updated: 02 July 2013
     Copyright (c) 1997-2013 University of Cambridge.

PCRE 8.34			  02 July 2013			  PCREPARTIAL(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=pcrepartial&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help