////用法：
//  仅支持双字节的汉字：
//  if (bRegExp && AkelPad.Include("cnRegExp.js")) pFindIt=cnRegExp(pFindIt);
//  支持双字节和四字节的汉字：
//  if (bRegExp && AkelPad.Include("cnRegExp.js")) pFindIt=cnRegExp(pFindIt,1); // 参数 1 为全区段匹配，也包含一些空白保留字符；2 为精确匹配，仅包含少量空白保留字符。

/*
TextPro支持下列通配符(注意大小写的区别)：

  以半角为主的部分：
  .(句点)  匹配任意半角或全角字符；
  \a       匹配任意英文字母；
  \~a      匹配除字母外的任意半角或全角字符；
  \d       匹配任意数字；
  \~d      匹配除数字外的任意半角或全角字符；
  \h       匹配任意词首字符(字母及下划线)；
  \~h      匹配除字母及下划线以外的任意字符；
  \l       匹配任意小写字母；
  \~l      匹配除小写字母外的任意半角或全角字符；
  \o       匹配任意八进制数字(0-7)；
  \~o      匹配除八进制数字外的任意字符；
  \p       匹配任意半角标点符号(非空格、字母、数字的可打印ASCII字符)；
  \~p      匹配除半角标点以外的任意半角或全角字符；
  \s       匹配任意空白字符（半角空格、TAB）；
  \~s      匹配任意非空白的半角或全角字符；
  \u       匹配任意大写字母；
  \~u      匹配除大写字母外的任意半角或全角字符；
  \w       匹配可成词的字符(字母、数字及下划线)；
  \~w      匹配成词字符(字母、数字及下划线)外的任意半角或全角字符；
  \x       匹配任意十六进制数字(0-9，a-f, A-F)；
  \~x      匹配除十六进制数字外的任意半角或全角字符；

  以全角为主的部分：
  \f      +匹配除ASCII字符外的任意全角字符；
  \~f     +匹配任意ASCII字符；
  \A       匹配任意全角ASCII字符；
  \b       匹配收录在BIG5码集中的任意字符；
  \~b      匹配未收录在BIG5码集中的任意字符；
  \c      +匹配任意汉字(不包括符号)；
  \~c     +匹配除汉字外的任意全角字符；
  \D       匹配地支字符(子丑寅卯……)；
  \g      +匹配收录在GBK码集中的任意字符；
  \~g     +匹配未收录在GBK码集中的任意字符；
  \G       匹配大写希腊字母
  \j       匹配日文片假名
  \J       匹配日文平假名
  \k       匹配小写希腊字母
  \m       匹配数学符号；
  \n       匹配中文数字(一二三四……)；
  \N       匹配大写中文数字(壹贰叁肆……)；
  \P       匹配全角标点符号；
  \r       匹配小写俄文字母；
  \R       匹配大写俄文字母；
  \S       匹配罗马数字，带点、括号或圆圈的序号(⒈⒉⒊⒋……)；
  \T       匹配天干字符(甲乙丙丁……)；
  \V       匹配竖排标点符号；
  \y      +匹配拼音字符；
  \Y       匹配注音字符；
  \Z       匹配制表字符；
*/

function cnRegExp(pStr, nSurrogate)
{
  var pCharSet;
  // 匹配中文字符的通配符 \c。支持所有双字节和四字节的汉字了！
  if (pStr.indexOf("\\c") != -1)
  {
    // 默认仅支持双字节的汉字
    pCharSet="\[" + 
             "\\u2E80-\\u2EFF" + // CJK Radicals Supplement = CJK部首补充
             "\\u3007" +         // 〇
             "\\u2F00-\\u2FDF" + // CJK Radicals / KangXi Radicals = 康熙部首
             "\\u31C0-\\u31EF" + // CJK Strokes = CJK笔划
             "\\u3400-\\u4DBF" + // CJK Extension-A = CJK 扩展 A
             "\\u4E00-\\u9FCF" + // CJK Unified Ideographs = CJK 统一表意符号
             "\\uE600-\\uE6CE" + //
             "\\uE815-\\uE864" + // Private Use Area 注：仅一些汉字
             "\\uF900-\\uFAFF" + // CJK Compatibility Ideographs = CJK 兼容表意符号
             "\]";

    // 双字节和四字节的汉字。注意：下面添加了括号，如果需要子匹配，匹配数要顺延 +1。
    if (nSurrogate)
    {
      if (nSurrogate==2)
      {
        pCharSet="\("+ 
                 pCharSet +                                   // 双字节汉字，下面的是四字节汉字。DC00-DFFF
                 "\|\[\\uD840-\\uD868\]\[\\uDC00-\\uDFFF\]" + // CJK Extension-B = CJK 扩展 B \u20000-\u2A6DF
                 "\|\\uD869\[\\uDC00-\\uDEDF\]" + 
                 "\|\\uD869\[\\uDF00-\\uDFFF\]" +             // CJK Extension-C = CJK 扩展 C \u2A700-\u2B73F
                 "\|\[\\uD86A-\\uD86C\]\[\\uDC00-\\uDFFF\]" +
                 "\|\\uD86D\[\\uDC00-\\uDF3F\]" +
                 "\|\\uD86D\[\\uDF40-\\uDFFF\]" +             // CJK Extension-D = CJK 扩展 D \u2B740-\u2B81F
                 "\|\\uD86E\[\\uDC00-\\uDC1F\]" +
                 "\|\\uD87E\[\\uDC00-\\uDE1F\]" +             // CJK Compatibility Ideographs Supplement = CJK 兼容表意符号补充 \u2F800-\u2FA1F
                 "\|\\uDB80\[\\uDC00-\\uDC4F\]" +             // Supplementary Private Use Area-A \uF0000-\uF004F. 注：仅一些汉字
                 "\)";
      }
      else
      {
        pCharSet="\("+pCharSet +                              
                 "\|\[\\uD840-\\uD87E\]\[\\uDC00-\\uDFFF\]" + // CJK 扩展 B、C、D 和 CJK 兼容表意符号补充，虽不够详细，但基本还是能准确的匹配。
                 "\|\\uDB80\[\\uDC00-\\uDC4F\]" +             // Supplementary Private Use Area-A \uF0000-\uF004F. 注：仅一些汉字
                 "\)";
      }
    }
    pStr=pStr.replace(/\\c/g, pCharSet);
  }

  // 匹配非中文字符的全角字符的通配符 \~c。
  if (pStr.indexOf("\\~c") != -1)
  {
    pStr=pStr.replace(/\\~c/g, "\[\\u00A4\\u00A7\\u00A8\\u00B0\\u00B1\\u00B7\\u00D7\\u00F7\\u02C7\\u02C9\\u02CA\\u02CB\\u02D9\\u0391-\\u03A1\\u03A3-\\u03A9\\u03B1-\\u03C1\\u03C3-\\u03C9\\u0401\\u0410-\\u044F\\u0451\\u2010\\u2013-\\u2016\\u2018\\u2019\\u201C\\u201D\\u2025\\u2026\\u2030\\u2032\\u2033\\u2035\\u203B\\u2103\\u2105\\u2109\\u2116\\u2121\\u2160-\\u216B\\u2170-\\u2179\\u2190-\\u2193\\u2196-\\u2199\\u2208\\u220F\\u2211\\u2215\\u221A\\u221D-\\u2220\\u2223\\u2225\\u2227-\\u222B\\u222E\\u2234-\\u2237\\u223D\\u2248\\u224C\\u2252\\u2260\\u2261\\u2264-\\u2267\\u226E\\u226F\\u2295\\u2299\\u22A5\\u22BF\\u2312\\u2460-\\u2469\\u2474-\\u249B\\u2500-\\u254B\\u2550-\\u2573\\u2581-\\u258F\\u2593-\\u2595\\u25A0\\u25A1\\u25B2\\u25B3\\u25BC\\u25BD\\u25C6\\u25C7\\u25CB\\u25CE\\u25CF\\u25E2-\\u25E5\\u2605\\u2606\\u2609\\u2640\\u2642\\u2FF0-\\u2FFB\\u3000-\\u3003\\u3005\\u3006\\u3008-\\u3017\\u301D\\u301E\\u3021-\\u3029\\u3041-\\u3093\\u309B-\\u309E\\u30A1-\\u30F6\\u30FC\\u30FD\\u30FE\\u3105-\\u3129\\u3220-\\u3243\\u3280-\\u32B0\\u32C0-\\u32CB\\u338E\\u338F\\u339C\\u339D\\u339E\\u33A1\\u33C4\\u33CE\\u33D1\\u33D2\\u33D5\\uFE30\\uFE31\\uFE33-\\uFE44\\uFE49-\\uFE52\\uFE54-\\uFE57\\uFE59-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF5E\\uFFE0-\\uFFE5\]");
  }
  
  // 匹配任意非ASCII字符 \f。
  if (pStr.indexOf("\\f") != -1)
  {
    pStr=pStr.replace(/\\f/g, "\[\^\\u0000-\\u007F\]");
  }

  // 匹配任意ASCII字符 \~f。
  if (pStr.indexOf("\\~f") != -1)
  {
    pStr=pStr.replace(/\\~f/g, "\[\u0009\\u0020-\\u007F\]");
  }

  // 匹配 GBK 的中文字符的通配符 \g。
  if (pStr.indexOf("\\g") != -1)
  {
    pStr=pStr.replace(/\\g/g, "\[\\u4E00-\\u9FCF\]");
  }

  // 匹配非 GBK 的中文字符的通配符 \~g。
  if (pStr.indexOf("\\~g") != -1)
  {
    // 默认仅支持双字节的汉字
    pCharSet="\[" + 
             "\\u2E80-\\u2EFF" + // CJK Radicals Supplement = CJK部首补充
             "\\u3007" +         // 〇
             "\\u2F00-\\u2FDF" + // CJK Radicals / KangXi Radicals = 康熙部首
             "\\u31C0-\\u31EF" + // CJK Strokes = CJK笔划
             "\\u3400-\\u4DBF" + // CJK Extension-A = CJK 扩展 A
             "\\uE600-\\uE6CE" + //
             "\\uE815-\\uE864" + // Private Use Area 注：仅一些汉字
             "\\uF900-\\uFAFF" + // CJK Compatibility Ideographs = CJK 兼容表意符号
             "\]";

    // 双字节和四字节的汉字。注意：下面添加了括号，如果需要子匹配，匹配数要顺延 +1。
    if (nSurrogate)
    {
      if (nSurrogate==2)
      {
        pCharSet="\("+ 
                 pCharSet +                                   // 双字节汉字，下面的是四字节汉字。DC00-DFFF
                 "\|\[\\uD840-\\uD868\]\[\\uDC00-\\uDFFF\]" + // CJK Extension-B = CJK 扩展 B \u20000-\u2A6DF
                 "\|\\uD869\[\\uDC00-\\uDEDF\]" + 
                 "\|\\uD869\[\\uDF00-\\uDFFF\]" +             // CJK Extension-C = CJK 扩展 C \u2A700-\u2B73F
                 "\|\[\\uD86A-\\uD86C\]\[\\uDC00-\\uDFFF\]" +
                 "\|\\uD86D\[\\uDC00-\\uDF3F\]" +
                 "\|\\uD86D\[\\uDF40-\\uDFFF\]" +             // CJK Extension-D = CJK 扩展 D \u2B740-\u2B81F
                 "\|\\uD86E\[\\uDC00-\\uDC1F\]" +
                 "\|\\uD87E\[\\uDC00-\\uDE1F\]" +             // CJK Compatibility Ideographs Supplement = CJK 兼容表意符号补充 \u2F800-\u2FA1F
                 "\|\\uDB80\[\\uDC00-\\uDC4F\]" +             // Supplementary Private Use Area-A \uF0000-\uF004F. 注：仅一些汉字
                 "\)";
      }
      else
      {
        pCharSet="\("+pCharSet +                              
                 "\|\[\\uD840-\\uD87E\]\[\\uDC00-\\uDFFF\]" + // CJK 扩展 B、C、D 和 CJK 兼容表意符号补充，虽不够详细，但基本还是能准确的匹配。
                 "\|\\uDB80\[\\uDC00-\\uDC4F\]" +             // Supplementary Private Use Area-A \uF0000-\uF004F. 注：仅一些汉字
                 "\)";
      }
    }
    pStr=pStr.replace(/\\~g/g, pCharSet);
  }

  // 匹配拼音字符 \y。
  if (pStr.indexOf("\\y") != -1)
  {
    pStr=pStr.replace(/\\y/g, "\[\\u00E0\\u00E1\\u00E8\\u00E9\\u00EA\\u00EC\\u00ED\\u00F2\\u00F3\\u00F9\\u00FA\\u00FC\\u0101\\u0113\\u011B\\u012B\\u0144\\u0148\\u014D\\u016B\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u0251\\u0261\]");
  }

  return pStr;
}
