regexec ()- 執行編譯的正規表示式

格式

#include <regex.h>
int regexec(const regex_t *preg, const char *string,
            size_t nmatch, regmatch_t *pmatch, int eflags);

語言層次

XPG4

安全執行緒

區分語言環境

此函數的行為可能受現行語言環境的 LC_CTYPE 及 LC_COLLATE 種類影響。 在編譯指令上指定 LOCALETYPE (*CLD) 時,無法使用此函數。 如需相關資訊,請參閱 瞭解 CCSID 及語言環境

說明

regexec() 函數會將空值結束的 字串 與已編譯的正規表示式 preg 進行比較,以尋找兩者之間的相符項。

nmatch 值是 string regexec() 函數應該嘗試與 preg中的子表示式相符的子字串數目。 您為 pmatch 提供的陣列必須至少具有 nmatch 元素。

regexec() 函數會在陣列 pmatch 的元素中填入 字串 中子字串的偏移,這些偏移對應於提供給 regcomp() 函數以建立 preg之原始型樣的用括弧括住的子表示式。 陣列的第零個元素對應於整個型樣。 如果有多個 nmatch 子表示式,則只會儲存第一個 nmatch-1 。 如果 nmatch 是 0 ,或在使用 regcomp() 函數建立 preg 時已設定 REG_NOSUB 旗標,則 regexec() 函數會忽略 pmatch 引數。

eflags 旗標 定義 regexec() 函數的可自訂行為:

errflag 說明字串
REG_NOTBOL 指出 string 的第一個字元不是行的開頭。
REG_NOTEOL 指出 string 的第一個字元不是行尾。

當符合基本或延伸正規表示式時,原始型樣的任何給定用括弧括住的子表示式都可以參與符合 string的數個不同子字串。 下列規則決定在 pmatch中報告哪些子字串:

  1. 如果正規表示式中的子表示式 i 未包含在另一個子表示式中,且它多次參與比對,則 pmatch [i] 中的位元組偏移會區隔最後一個這類比對。
  2. 如果子表示式 i 未包含在另一個子表示式中,且它未參與順利完成的比對,則 pmatch [i] 中的位元組偏移會是 -1。 當符合下列任何條件時,子表示式不會參與比對:
    • *\{ \} 會緊接在基本正規表示式中的子表示式之後。
    • *?{ } 會緊接出現在延伸正規表示式中的子表示式之後,且子表示式不相符 (符合 0 次)。
    • | 用於延伸正規表示式中,以選取此子表示式或另一個子表示式,以及符合的其他子表示式。
  3. 如果子表示式 i 包含在另一個子表示式 j內,且 i 未包含在 j內所包含的任何其他子表示式內,且 pmatch [j]中報告了子表示式 j 的相符項,則 pmatch [i] 中報告的子表示式 i 的相符項或不相符項將如 1 中所述。 2. 但在 pmatch [j] 中所報告的子字串內,而不是整個字串內。
  4. 如果子表示式 i 包含在子表示式 j中,且 pmatch [j] 中的位元組偏移為 -1 ,則 pmatch [i] 中的偏移也將為 -1。
  5. 如果子表示式 i 符合零長度字串,則 pmatch [i] 中的兩個位元組偏移會是字元或空值終止符緊接在零長度字串後面的位元組偏移。
如果在 regcomp() 函數建立 preg 時設定 REG_NOSUB 旗標,則不會指定 pmatch 的內容。 如果在建立 preg 時設定 REG_NEWLINE 旗標,則字串中容許換行字元。

回覆值

如果找到相符項, regexec() 函數會傳回 0。 如果找不到相符項,則 regexec() 函數會傳回 REG_NOMATCH。 否則,它會傳回非零值,指出發生錯誤。 在呼叫 regerror() 函數時可以使用非零回覆值。

範例

#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
   regex_t    preg;
   char       *string = "a very simple simple simple string";
   char       *pattern = "\\(sim[a-z]le\\) \\1";
   int        rc;
   size_t     nmatch = 2;
   regmatch_t pmatch[2];
 
   if (0 != (rc = regcomp(&preg, pattern, 0))) {
      printf("regcomp() failed, returning nonzero (%d)\n", rc);
      exit(EXIT_FAILURE);
   }
 
   if (0 != (rc = regexec(&preg, string, nmatch, pmatch, 0))) {
      printf("Failed to match '%s' with '%s',returning %d.\n",
             string, pattern, rc);
   }
   else {
      printf("With the whole expression, "
             "a matched substring \"%.*s\" is found at position %d to %d.\n",
             pmatch[0].rm_eo - pmatch[0].rm_so, &string[pmatch[0].rm_so],
             pmatch[0].rm_so, pmatch[0].rm_eo - 1);
      printf("With the sub-expression, "
             "a matched substring \"%.*s\" is found at position %d to %d.\n",
             pmatch[1].rm_eo - pmatch[1].rm_so, &string[pmatch[1].rm_so],
             pmatch[1].rm_so, pmatch[1].rm_eo - 1);
   }
   regfree(&preg);
   return 0;
 
   /****************************************************************************
      The output should be similar to :
 
      With the whole expression, a matched substring "simple simple" is found
      at position 7 to 19.
      With the sub-expression, a matched substring "simple" is found
      at position 7 to 12.
   ****************************************************************************/
}

相關資訊