2

char*utf8 フラグを有効にして PCRE パターンをコンパイルし、utf8文字列と照合しようとしていますが、一致せず、pcre_exec負の値が返されます。件名の長さをpcre_exec文字列の文字数である 65 として渡します。バイト数を期待していると思うので、引数を70まで増やしてみましたが、それでも同じ結果が得られます。他に何が試合を失敗させているのかわかりません。私が自分自身を撃つ前に助けてください。

(ただし、フラグなしで試してみるとPCRE_UTF8、一致しますが、オフセット vector[1] は 30 です。これは、入力文字列の Unicode 文字の直前の文字のインデックスです)

#include "stdafx.h"
#include "pcre.h"
#include <pcre.h>               /* PCRE lib        NONE  */
#include <stdio.h>              /* I/O lib         C89   */
#include <stdlib.h>             /* Standard Lib    C89   */
#include <string.h>             /* Strings         C89   */
#include <iostream>

int main(int argc, char *argv[]) 
{
   pcre *reCompiled;

   int pcreExecRet;
   int subStrVec[30];
   const char *pcreErrorStr;
   int pcreErrorOffset; 
   char* aStrRegex = "(\\?\\w+\\?\\s*=)?\\s*(call|exec|execute)\\s+(?<spName>\\w+)(" 
                                     // params can be an empty pair of parenthesis or have parameters inside them as well.
                                     "\\(\\s*(?<params>[?\\w,]+)\\s*\\)"
                                     // paramList along with its parenthesis is optional below so a SP call can be just "exec sp_name" for a stored proc call without any parameters.
                                     ")?";
    reCompiled = pcre_compile(aStrRegex, 0, &pcreErrorStr, &pcreErrorOffset, NULL);
    if(reCompiled == NULL) {
      printf("ERROR: Could not compile '%s': %s\n", aStrRegex, pcreErrorStr);
      exit(1);
    } 

    char* line = "?rt?=call SqlTxFunctionTesting(?înFîéld?,?outField?,?inOutField?)";
    pcreExecRet = pcre_exec(reCompiled,
                            NULL,
                            line, 
                            65,  // length of string
                            0,                      // Start looking at this point
                            0,                      // OPTIONS
                            subStrVec,
                            30);                    // Length of subStrVec

   printf("\nret=%d",pcreExecRet);

   //int substrLen = pcre_get_substring(line, subStrVec, pcreExecRet, 1, &mantissa);

}
4

1 に答える 1

1

1)

char * q= "î";
printf("%d, %s", q[0], q);

出力:
63, ?

2) PCRE_BUILD_PCRE16 (または 32) と PCRE_SUPPORT_UTF を使用して PCRE を再構築する必要があります。そして、pcre16.lib および/または pcre16.dll を使用します。次に、次のコードを試すことができます。

  pcre16 *reCompiled;
  int pcreExecRet;
  int subStrVec[30];
  const char *pcreErrorStr;
  int pcreErrorOffset;  
  wchar_t* aStrRegex = L"(\\?\\w+\\?\\s*=)?\\s*(call|exec|execute)\\s+(?<spName>\\w+)(" 
                                     // params can be an empty pair of paranthesis or have parameters inside them as well.
                                     L"\\(\\s*(?<params>[?,\\w\\p{L}]+)\\s*\\)"
                                     // paramList along with its paranthesis is optional below so a SP call can be just "exec sp_name" for a stored proc call without any parameters.
                                     L")?";
   reCompiled = pcre16_compile((PCRE_SPTR16)aStrRegex, PCRE_UTF8, &pcreErrorStr, &pcreErrorOffset, NULL);
   if(reCompiled == NULL) {
    printf("ERROR: Could not compile '%s': %s\n", aStrRegex, pcreErrorStr);
    exit(1);
   } 

  const wchar_t* line = L"?rt?=call SqlTxFunctionTesting(  ?inField?,?outField?,?inOutField?,?fd?  )";
  const wchar_t* mantissa=new wchar_t[wcslen(line)];
  pcreExecRet = pcre16_exec(reCompiled,
                            NULL,
                            (PCRE_SPTR16)line, 
                            wcslen(line),  // length of string
                            0,                      // Start looking at this point
                            0,                      // OPTIONS
                            subStrVec,
                            30);                    // Length of subStrVec

 printf("\nret=%d",pcreExecRet);
 for (int i=0;i<pcreExecRet;i++){
     int substrLen = pcre16_get_substring((PCRE_SPTR16)line, subStrVec, pcreExecRet, i, (PCRE_SPTR16 *)&mantissa);
     wprintf(L"\nret string=%s, length=%i\n",mantissa,substrLen);
 }

3) \w = [0-9A-Z_a-z]. Unicode 記号は含まれていません。
4) これは本当に役に立ちます: http://answers.oreilly.com/topic/215-how-to-use-unicode-code-points-properties-blocks-and-scripts-in-regular-expressions/
5) からPCRE 8.33 ソース (pcre_exec.c:2251)

/* Find out if the previous and current characters are "word" characters.
It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to
be "non-word" characters. Remember the earliest consulted character for
partial matching. */
于 2013-08-28T08:19:27.863 に答える