C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- std::sub_match
- std::match_results
- std::basic_regex
- std::regex_search
- std::regex_replace
- std::regex_iterator
- std::regex_match
- std::regex_token_iterator
- std::regex_error
- std::regex_traits
- std::regex_constants::syntax_option_type
- std::regex_constants::match_flag_type
- std::regex_constants::error_type
- æ¹ ECMAScript æ£åè¡¨è¾¾å¼ææ³
- 注é
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >æ£å表达å¼åº > æ¹ ECMAScript æ£åè¡¨è¾¾å¼ææ³
æ¹ ECMAScript æ£åè¡¨è¾¾å¼ææ³
æ¤é¡µé¢æè¿°ä»¥è®¾ç½®ä¸º ECMAScript ï¼é»è®¤å¼ï¼ç syntax_option_type æé std::basic_regex æ¶ä½¿ç¨çææ³ãå
¶ä»åæ¯ææ£åè¡¨è¾¾å¼ææ³è§ syntax_option_type ã
C++ ä¸ç ECMAScript æ£åè¡¨è¾¾å¼ææ³æ¯å¸¦æ è®°æåè¿° (ä»
C++) çä¿®æ¹ç ECMA-262 ææ³ã
å¯é项
æ£åè¡¨è¾¾å¼æ¨¡å¼æ¯ä¸æå¤ä¸ªä»¥æåè¿ç®ç¬¦ | åéçå¯é项å¯é项 (Alternative) åºåï¼æ¢è¨ä¹ï¼æåè¿ç®ç¬¦æ¥ææä½ä¼å
级ï¼
Pattern ::
- Disjunction
Disjunction ::
- Alternative
- Alternative
|Disjunction
模å¼é¦å å°è¯è·³è¿æå (Disjunction) å¹¶å¹é ï¼æååçï¼åéå©ä½æ£å表达å¼çå¯é项ã
è¥å®å¤±è´¥ï¼åè¯å¾è·³è¿å·¦ä¾§å¯é项并å¹é å³ä¾§æåï¼åéå©ä½æ£å表达å¼ï¼ã
è¥å·¦ä¾§å¯é项ãå³ä¾§æååå©ä½æ£å表达å¼é½æ¥æéæ©ç¹ï¼åå¨å°è¯ç§»å¨å°å·¦ä¾§å¯é项ä¸çä¸ä¸ªéæ©åï¼å°è¯å©ä½è¡¨è¾¾å¼å¼ä¸çææéæ©ãè¥ç©·å°½äºå·¦ä¾§å¯é项ä¸çææéæ©ï¼åå代左侧å¯é项å°è¯å³ä¾§æåã
è·³è¿çå¯é项å çä»»ä½æè·æ¬å·äº§ç空åå¹é ã
#include <iostream> #include <regex>  void show_matches(const std::string& in, const std::string& re) { std::smatch m; std::regex_search(in, m, std::regex(re)); if(m.empty()) { std::cout << "input=[" << in << "], regex=[" << re << "]: NO MATCH\n"; } else { std::cout << "input=[" << in << "], regex=[" << re << "]: "; std::cout << "prefix=[" << m.prefix() << "] "; for(std::size_t n = 0; n < m.size(); ++n) std::cout << " m[" << n << "]=[" << m[n] << "] "; std::cout << "suffix=[" << m.suffix() << "]\n"; } } int main() { show_matches("abcdef", "abc|def"); show_matches("abc", "ab|abc"); // é¦å å¹é 左侧å¯é项  // é对åéå©ä½æ£åè¡¨è¾¾å¼ (c|bc) 左侧å¯é项 (a) çå¹é æå // å®çæ m[1]="a" å m[4]="bc" ã // è·³è¿çå¯é项 (ab) å (c) å°å ¶åå¹é m[3] å m[5] 置为空ã show_matches("abc", "((a)|(ab))((c)|(bc))"); }
è¾åºï¼
input=[abcdef], regex=[abc|def]: prefix=[] m[0]=[abc] suffix=[def] input=[abc], regex=[ab|abc]: prefix=[] m[0]=[ab] suffix=[c] input=[abc], regex=[((a)|(ab))((c)|(bc))]: prefix=[] m[0]=[abc] m[1]=[a] m[2]=[a] m[3]=[] m[4]=[bc] m[5]=[] m[6]=[bc] suffix=[]
项
æ¯ä¸ªå¯éé¡¹ä¸ºç©ºï¼æä¸ºé¡¹ (Term) çåºåï¼é¡¹é´æ åé符ï¼
Alternative ::
- [empty]
- Alternative Term
空çå¯é项å§ç»å¹é å¹¶ä¸ä¸æ¶èä»»ä½è¾å ¥ã
ç¸ç»§ç项å°è¯åæ¶å¹é è¾å ¥çè¿ç»é¨åã
è¥å·¦ä¾§å¯é项ãå³ä¾§é¡¹åå©ä½æ£åè¡¨è¾¾å¼æ¥æéæ©ç¹ï¼åå¨ç§»å¨å°å³ä¾§é¡¹ä¸çä¸ä¸ªéæ©åï¼å°è¯å©ä½æ£å表达å¼ä¸çææéæ©ï¼å¹¶å¨ç§»å¨å°å·¦ä¾§å¯é项ä¸çä¸ä¸ªéæ©åï¼å°è¯å³ä¾§é¡¹ä¸çææéæ©ã
#include <iostream> #include <regex>  void show_matches(const std::string& in, const std::string& re) { std::smatch m; std::regex_search(in, m, std::regex(re)); if(m.empty()) { std::cout << "input=[" << in << "], regex=[" << re << "]: NO MATCH\n"; } else { std::cout << "input=[" << in << "], regex=[" << re << "]: "; std::cout << "prefix=[" << m.prefix() << "] "; for(std::size_t n = 0; n < m.size(); ++n) std::cout << " m[" << n << "]=[" << m[n] << "] "; std::cout << "suffix=[" << m.suffix() << "]\n"; } } int main() { show_matches("abcdef", ""); // 空æ£åè¡¨è¾¾å¼æ¯å个空å¯é项 show_matches("abc", "abc|"); // å·¦å¯é项é¦å å¹é show_matches("abc", "|abc"); // å·¦å¯é项é¦å å¹é ï¼çå¾ abc æªå¹é }
è¾åºï¼
input=[abcdef], regex=[]: prefix=[] m[0]=[] suffix=[abcdef] input=[abc], regex=[abc|]: prefix=[] m[0]=[abc] suffix=[] input=[abc], regex=[|abc]: prefix=[] m[0]=[] suffix=[abc]
æ°éè¯
- æ¯ä¸ªé¡¹ 为æè¨ (Assertion)ï¼è§åæ¹ï¼æåå (Atom) ï¼è§åæ¹ï¼ï¼æååç«å³åéæ°éè¯ (Quantifier) ä¹ä¸
Term ::
- Assertion
- Atom
- Atom Quantifier
æ¯ä¸ªæ°éè¯ä¸ºè´ªå¿ (greedy) æ°éè¯ï¼ä»
ç±ä¸ä¸ªæ°éè¯åç¼ (QuantifierPrefix) ç»æï¼æéè´ªå¿ (non-greedy) æ°éè¯ï¼ç±ä¸ä¸ªæ°éè¯åç¼åéé®å·æ©ç ? ç»æï¼ã
Quantifier ::
- QuantifierPrefix
- QuantifierPrefix
?
æ¯ä¸ªæ°éè¯åç¼ç¡®å®äºä¸ªæ°ï¼æå°é夿°åæå¤§é夿°ï¼å¦ä¸ï¼
éè¿å¨æ¯ä¸ªæ°ä½ä¸è°ç¨ std::regex_traits::value(ä» C++)è·å¾åç¬çåè¿å¶æ° (DecimalDigits) çå¼ã
åååéæ°éè¯é夿°éè¯ææå®ç次æ°ãæ°éè¯è½ä¸ºéè´ªå¿ï¼è¯¥æ åµä¸å忍¡å¼éå¤å¨ä»ç¶å¹é å©ä½æ£å表达å¼çåæ¶å°½å¯è½å°ç次æ°ï¼æè½ä¸ºè´ªå¿ï¼è¯¥æ åµä¸å忍¡å¼éå¤å¨ä»ç¶å¹é å©ä½æ£å表达å¼çåæ¶éå¯é¥å¤ç次æ°ã
éå¤çæ¯å忍¡å¼ï¼èéå ¶æå¹é çè¾å ¥ï¼æ ååçä¸åéå¤è½å¹é ä¸åçè¾å ¥å串ã
è¥åååå©ä½æ£å表达å¼é½æéæ©ç¹ï¼åé¦å å°ååå¹é å°½å¯è½å°½å¯è½å¤ï¼æå°ï¼è¥ä¸ºéè´ªå¿ï¼æ¬¡ãï¼ç§»å¨å°ååçæå䏿¬¡éå¤ä¸çä¸ä¸ªéæ©åï¼å°è¯å©ä½æ£å表达å¼ä¸çææéæ©ãç§»å¨å°ååçåæ°ç¬¬äºï¼ç¬¬ n-1 ï¼æ¬¡éå¤ä¸çä¸ä¸ªéæ©åï¼å°è¯ååçæåä¸ï¼ç¬¬ n ï¼æ¬¡éå¤ä¸çææéæ©ï¼å¨æç¡®ç°å¨å¯è½æååçæ´å¤ææ´å°é夿¶ï¼å¨ç§»å¨å°ååç第 n-1 次éå¤ä¸çä¸ä¸ªéæ©åï¼å°è¿äºç©·å°½ï¼å次以尽å¯è½å°æå¤å¼å§ï¼ï¼ä»¥æ¤ç±»æ¨ã
æ¯æ¬¡éå¤åå'æ¶ï¼æ¸ é¤å ¶æè·ï¼è§åæ¹ "(z)((a+)?(b+)?(c))*" ç示ä¾ï¼
#include <iostream> #include <regex>  void show_matches(const std::string& in, const std::string& re) { std::smatch m; std::regex_search(in, m, std::regex(re)); if(m.empty()) { std::cout << "input=[" << in << "], regex=[" << re << "]: NO MATCH\n"; } else { std::cout << "input=[" << in << "], regex=[" << re << "]: "; std::cout << "prefix=[" << m.prefix() << "] "; for(std::size_t n = 0; n < m.size(); ++n) std::cout << " m[" << n << "]=[" << m[n] << "] "; std::cout << "suffix=[" << m.suffix() << "]\n"; } } int main() { // è´ªå¿å¹é ï¼éå¤ [a-z] 4 次 show_matches("abcdefghi", "a[a-z]{2,4}"); // éè´ªå¿å¹é ï¼éå¤ [a-z] 2 次 show_matches("abcdefghi", "a[a-z]{2,4}?");  // æ°éè¯çéæ©ç¹é¡ºåºï¼çæå¸¦äºä¸ªéå¤çå¹é ï¼ // 第ä¸ä¸ªå¹é å串 "aa" ï¼ç¬¬äºä¸ªå¹é å串 "ba" ï¼ä¿ç "ac" å¹é // ï¼"ba" åºç°äº m[1] çæè·åå¥ä¸ï¼ show_matches("aabaac", "(aa|aabaac|ba|b|c)*");  // æ°éè¯çéæ©ç¹é¡ºåºä»¤æ¤ regex è®¡ç® 10 ä¸ 15 é´çæå¤§å ¬çº¦æ° // ï¼çæ¡æ¯ 5 ï¼å¹¶ä»¥ "aaaaa" å¡«å m[1] ï¼ show_matches("aaaaaaaaaa,aaaaaaaaaaaaaaa", "^(a+)\\1*,\\1+$");  // å串 "bbb" ä¸åºç°äºæè·åå¥ m[4] ä¸ // å 为å®å¨åå (a+)?(b+)?(c) çç¬¬äºæ¬¡éå¤å¹é å串 "ac" æ¶è¢«å£°æ // æ³¨ï¼ gcc çè§£æè¯¯ââ宿²¡ææ£ç¡®å°æ ECMA-262 21.2.2.5.1 æ¸ é¤ // matches[4] æè·ç»ï¼ä»èé误å°å¯¹äºè¯¥ç»æè· "bbb" ã show_matches("zaacbbbcac", "(z)((a+)?(b+)?(c))*"); }
è¾åºï¼
input=[abcdefghi], regex=[a[a-z]{2,4}]: prefix=[] m[0]=[abcde] suffix=[fghi]
input=[abcdefghi], regex=[a[a-z]{2,4}?]: prefix=[] m[0]=[abc] suffix=[defghi]
input=[aabaac], regex=[(aa|aabaac|ba|b|c)*]:
prefix=[] m[0]=[aaba] m[1]=[ba] suffix=[ac]
input=[aaaaaaaaaa,aaaaaaaaaaaaaaa], regex=[^(a+)\1*,\1+$]:
prefix=[] m[0]=[aaaaaaaaaa,aaaaaaaaaaaaaaa] m[1]=[aaaaa] suffix=[]
input=[zaacbbbcac], regex=[(z)((a+)?(b+)?(c))*]:
prefix=[] m[0]=[zaacbbbcac] m[1]=[z] m[2]=[ac] m[3]=[a] m[4]=[] m[5]=[c] suffix=[]æè¨
æè¨ (Assertion) å¹é æ¡ä»¶ï¼èéè¾å ¥å符串çå串ãå®ä»¬å³ä¸æ¶è任使¥èªè¾å ¥çåç¬¦ãæ¯ä¸ªæè¨æ¯ä¸åä¹ä¸
Assertion ::
-
^ -
$ -
\b -
\B -
(?=Disjunction) -
(?!Disjunction)
æè¨ ^ ï¼è¡èµ·å§ï¼å¹é
æè¨ $ ï¼è¡ç»å°¾ï¼å¹é
ä¸é¢äºä¸ªæè¨åä¸é¢çåå . ä¸ï¼è¡ç»æ¢ç¬¦æ¯ä¸åå个å符ä¹ä¸ï¼ U+000A ï¼ \n ææ¢è¡ï¼ã U+000D ï¼ \r æå车ï¼ã U+2028 ï¼è¡åéç¬¦ï¼æ U+2029 ï¼æ®µåé符ï¼
æè¨ \b ï¼è¯è¾¹çï¼å¹é
æè¨ \B ï¼åè¯è¾¹çï¼å¹é
ææå符ï¼é¤äºä¸åå
容
è¥æåä¼å¹é
å¨å½åä½ç½®çè¾å
¥ï¼åæè¨ ( ? = æå ) ï¼é¶å®½æ£åç»ï¼å¹é
ã
è¥æåä¸ä¼å¹é
å¨å½åä½ç½®ççè¾å
¥ï¼åæè¨ ( ? ! æå ) ï¼é¶å®½è´åç»ï¼å¹é
ã
对äºä¸¤ä¸ªåç»æè¨ï¼å¨å¹é æåæ¶ï¼ä¸å¨å¹é å©ä½æ£å表达å¼ä¹å令ä½ç½®åè¿ãå¦å¤ï¼è¥æåè½ä»¥å¤ç§æ¹å¼å¨å½åä½ç½®å¹é ï¼ååªå°è¯ç¬¬ä¸ä¸ªã
ECMAScript ç¦æ¢åæ¤å°åç»æåä¸ï¼è¿å½±åå°æ¥èªå©ä½æ£å表达å¼çæ£åç»ä¸çåæº¯å¼ç¨ï¼è§ä¸æ¹ç¤ºä¾ï¼ ãå°æ¥èªå©ä½æ£å表达å¼çè´åç»ä¸çåæº¯å¼ç¨å§ç»æ²¡æå®ä¹ï¼å 为åç»æè¨å¿ 宿 æ³ç»§ç»ï¼ã
注æï¼åç»æè¨å¯ç¨äºå建å¤ä¸ªæ£å表达å¼é´çé»è¾ä¸ï¼è§ä¸æ¹ç¤ºä¾ï¼ã
#include <iostream> #include <regex>  void show_matches(const std::string& in, const std::string& re) { std::smatch m; std::regex_search(in, m, std::regex(re)); if(m.empty()) { std::cout << "input=[" << in << "], regex=[" << re << "]: NO MATCH\n"; } else { std::cout << "input=[" << in << "], regex=[" << re << "]: "; std::cout << "prefix=[" << m.prefix() << "] "; for(std::size_t n = 0; n < m.size(); ++n) std::cout << " m[" << n << "]=[" << m[n] << "] "; std::cout << "suffix=[" << m.suffix() << "]\n"; } } int main() { // å¨è¾å ¥ç»å°¾å¹é a show_matches("aaa", "a$");  // å¨ç¬¬ä¸ä¸ªè¯ç»å°¾å¹é o show_matches("moo goo gai pan", "o\\b");  // åç»å¹é ç«å³å¨ç¬¬ä¸ä¸ª b ä¹åç空å符串 // è¿ä»¥ "aaa" å¡«å m[1] ï¼å°½ç®¡ m[0] 为空 show_matches("baaabac", "(?=(a+))");  // å ä¸ºç¦æ¢å溯å¼ç¨åæ¤å°åç»ä¸ï¼ // è¿å¹é aba èé aaaba show_matches("baaabac", "(?=(a+))a*b\\1");  // ç»ç±åç»çé»è¾ä¸ï¼æ¤å¯ç å¹é ï¼è¥å®å«æ // è³å°ä¸ä¸ªå°å忝 // ä¸ è³å°ä¸ä¸ªå¤§å忝 // ä¸ è³å°ä¸ä¸ªæ ç¹å符 // ä¸ è³å°æ 6 个åç¬¦é¿ show_matches("abcdef", "(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}"); show_matches("aB,def", "(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}"); }
è¾åºï¼
input=[aaa], regex=[a$]: prefix=[aa] m[0]=[a] suffix=[]
input=[moo goo gai pan], regex=[o\b]: prefix=[mo] m[0]=[o] suffix=[ goo gai pan]
input=[baaabac], regex=[(?=(a+))]: prefix=[b] m[0]=[] m[1]=[aaa] suffix=[aaabac]
input=[baaabac], regex=[(?=(a+))a*b\1]: prefix=[baa] m[0]=[aba] m[1]=[a] suffix=[c]
input=[abcdef], regex=[(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}]:
NO MATCH
input=[aB,def], regex=[(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}]:
prefix=[] m[0]=[aB,def] suffix=[]åå
ååè½ä¸ºä¸åä¹ä¸ï¼
Atom ::
- PatternCharacter
-
. -
\AtomEscape - CharacterClass
-
(Disjunction) -
(?:Disjunction)
å ¶ä¸ AtomEscape ::
- DecimalEscape
- CharacterEscape
- CharacterClassEscape
ä¸åç§ç±»çå忱弿¹å¼ä¸åã
å表达å¼
åå ( æå ) æ¯ææ 记表达å¼ï¼å®æ§è¡æåå¹¶å卿忿¶èçè¾å
¥å串äºåå¹é
æ°ç»ï¼ä¸æ 对åºå¨æ¤ç¹å·²éå°çæ´ä¸ªæ£å表达å¼ä¸ï¼ææ è®°å表达å¼ç左弿¬å· ( 次æ°ã
é¤äºå¨ std::match_results ä¸è¿åï¼æè·çåå¹é
è¿å¯ä½ä¸ºå溯å¼ç¨ï¼ \1 ã \2 â¦â¦ï¼è®¿é®ï¼å¹¶å¨æ£å表达å¼ä¸å¼ç¨å®ä»¬ã注æ std::regex_replace 以å String.prototype.replace (ECMA-262, part 15.5.4.11) çæ¹å¼ï¼å¯¹äºå溯å¼ç¨ä»¥ $ ä»£æ¿ \ ï¼ $1 ã $2 â¦â¦ï¼ã
åå ( ? : æå ) ï¼éæ è®°å表达å¼ï¼ç®åå°æ±å¼ æå å¹¶ä¸åå¨å
¶ç»æäºåå¹é
ãè¿å纯æ¯è¯æ³åç»ã
| æ¬èæªå®æ åå ï¼ææ ç¤ºä¾ |
åæº¯å¼ç¨
DecimalEscape ::
- DecimalIntegerLiteral [lookahead â DecimalDigit]
è¥ \ åéé¦ä½é 0 çåè¿å¶æ° N ï¼å认为该转ä¹åºåä¸ºåæº¯å¼ç¨ (backreference) ãéè¿å¨æ¯ä¸ªæ°ä½ä¸è°ç¨ std::regex_traits::value(ä»
C++) å¹¶ç¨åº 10 ç®æ¯ç»ååå
¶ç»æè·å¾ N ãè¥ N å¤§äºæ´ä¸ªæ£å表达å¼ä¸æè·æ¬å·çæ»æ°ï¼å为é误ã
åæº¯å¼ç¨ \N ä½ä¸ºåååºç°æ¶ï¼å®å¹é
å½ååå¨äºåå¹é
æ°ç»ä¸ç¬¬ N 个å
ç´ çå串ã
åè¿å¶è½¬ä¹ \0 䏿¯å溯å¼ç¨ï¼å®æ¯è¡¨ç¤ºç©ºå符çå符转ä¹ãå®ä¸è½ä¸ºåè¿å¶æ°æåéã
| æ¬èæªå®æ åå ï¼ææ ç¤ºä¾ |
åå符å¹é
åå . å¹é
å¹¶æ¶èæ¥èªè¾å
¥åºåçä»»ä¸å符ï¼é¤äºè¡ç»æ¢ç¬¦ï¼ U+000A ã U+000D ã U+2028 æ U+2029 ï¼
åå æ¨¡å¼å符 ï¼å
¶ä¸æ¨¡å¼å符 (PatternCharacter) ä¸ºä»»ä½æºå符 (SourceCharacter) ï¼é¤äºå符 ^ $ \ . * + ? ( ) [ ] { } | ï¼å¹é
å¹¶æ¶èä¸ä¸ªæ¥èªè¾å
¥çå符ï¼è¥å®çäºæ¤æ¨¡å¼å符ã
è¿ä¸ªåææå ¶ä»åå符å¹é å®ä¹å¦ä¸ï¼
æ¯ä¸ªç±è½¬ä¹å符 \ åéåç¬¦è½¬ä¹ (CharacterEscape) çååï¼è¿æç¹æ®åè¿å¶è½¬ä¹ \0 ï¼å¹é
æ¶èä¸ä¸ªæ¥èªè¾å
¥çå符ï¼è¥å®çäºåç¬¦è½¬ä¹æè¡¨ç¤ºçå符ã辨è¯ä¸åå符转ä¹åºåï¼
CharacterEscape ::
- ControlEscape
-
cControlLetter - HexEscapeSequence
- UnicodeEscapeSequence
- IdentityEscape
æ¤å¤æ§å¶è½¬ä¹ (ControlEscape) 为ä¸åäºä¸ªå符ä¹ä¸ï¼ f n r t v
| æ§å¶è½¬ä¹ | ç¼ç åå | åç§° |
|---|---|---|
f
|
U+000C | æ¢é¡µ |
n
|
U+000A | æ¢è¡ |
r
|
U+000D | å车 |
t
|
U+0009 | æ°´å¹³å¶è¡¨ |
v
|
U+000B | åç´å¶è¡¨ |
æ§å¶åæ¯ (ControlLetter) 为任ä½å°åæå¤§å ASCII å符ï¼èæ¤åç¬¦è½¬ä¹æå¹é
å符çç¼ç åå
çäºæ§å¶åæ¯çç¼ç åå
çå¼é¤ä»¥ 32 ï¼ä¾å¦ \cD å \cd é½å¹é
ç¼ç åå
U+0004 (EOT) ï¼å 为 'D' æ¯ U+0044 è 0x44 % 32 == 4 å¹¶ä¸ 'd' æ¯ U+0064 è 0x64 % 32 == 4 ã
åå
è¿å¶è½¬ä¹åºå (HexEscapeSequence) æ¯åæ¯ x åéåç¡®äºä¸ªåå
è¿å¶ä½ (HexDigit) ï¼å
¶ä¸åå
è¿å¶ä½æ¯ 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F ä¹ä¸ï¼ãæ¤åç¬¦è½¬ä¹æå¹é
å符çç¼ç åå
çäºäºä½åå
è¿å¶æ°çæ°å¼ã
Unicode转ä¹åºå (UnicodeEscapeSequence) æ¯åæ¯ u åéåç¡®å个åå
è¿å¶ä½ãæ¤åç¬¦è½¬ä¹æå¹é
å符çç¼ç åå
çäºæ¤åä½åå
è¿å¶æ°çæ°å¼ãè¥è¯¥å¼ä¸éäºæ¤ std::basic_regex ç CharT ï¼åæåº std::regex_error (ä»
C++)ã
èªèº«è½¬ä¹ (IdentityEscape) è½ä¸ºä»»ä½é忝æ°åçå符ï¼ä¾å¦å¦ä¸åææ ãå®ç §åæ ·å¹é å符ã
| æ¬èæªå®æ åå ï¼ææ ç¤ºä¾ |
å符类
ååè½è¡¨ç¤ºå符类ï¼å³å®ä¼å¹é å¹¶æ¶èä¸ä¸ªå符ï¼è¥è¯¥å符å±äºé¢å®ä¹çå符ç»ä¹ä¸ã
å符类è½éè¿å符类转ä¹å¼å ¥ï¼
Atom ::
-
\CharacterClassEscape
æç´æ¥ä¸º
Atom ::
- CharacterClass
åç¬¦ç±»è½¬ä¹æ¯ä¸äºå¸¸ç¨å符类çç®æ´åæ³ï¼å¦ä¸ï¼
| åç¬¦ç±»è½¬ä¹ | ç±»å表达å¼(ä» C++) | å«ä¹ |
|---|---|---|
d
|
[[:digit:]]
|
æ°å |
D
|
[^[:digit:]]
|
éæ°å |
s
|
[[:space:]]
|
空ç½å符 |
S
|
[^[:space:]]
|
é空ç½å符 |
w
|
[_[:alnum:]]
|
忝æ°åå符åå符 _
|
W
|
[^_[:alnum:]]
|
å¼äºåæ¯æ°åæ _ çå符
|
å符类 (CharacterClass) æ¯æ¹æ¬å·ç¯ç»çç±»èå´ (ClassRanges) åºåï¼å¯éå°ä»¥ååè¿ç®ç¬¦ ^ å¼å§ãè¥å®å§äº ^ ï¼åæ¤ååå¹é
ä»»ä½ä¸å¨ææç±»èå´çå¹¶æè¡¨ç¤ºçå符éåä¸çå符ãå¦åï¼æ¤ååå¹é
ä»»ä½å¨ææç±»èå´çå¹¶æè¡¨ç¤ºçå符éåä¸çå符ã
CharacterClass ::
-
[[lookahead â {^}] ClassRanges] -
[^ClassRanges]
ClassRanges ::
- [empty]
- NonemptyClassRanges
NonemptyClassRanges ::
- ClassAtom
- ClassAtom NonemptyClassRangesNoDash
- ClassAtom - ClassAtom ClassRanges
è¥é空类èå´æ¥æå½¢å¼ ClassAtom - ClassAtom ï¼åå®å¹é
æ¥èªå®ä¹å¦ä¸çèå´çä»»ä½å符ï¼(ä»
C++)
é¦ä¸ªç±»åå (ClassAtom) å¿
é¡»å¹é
å个对ç
§å
ç´ c1 ï¼è第äºä¸ªç±»ååå¿
é¡»å¹é
å个对ç
§å
ç´ c2 ãéç¨ä¸åæ¥éª¤ï¼æµè¯æ¤èå´æ¯å¦å¹é
è¾å
¥å符 c ï¼
c1 <= c && c <= c2 åå¹é
cc ã c1 å c2 ï¼ç» std::regex_traits::translate_nocasec ã c1 å c2 ï¼ç» std::regex_traits::translatetransformed c1 <= transformed c && transformed c <= transformed c2 åå¹é
cæåé¢å¯¹å¾
å符 - ï¼è¥å®æ¯ä¸åä¹ä¸
- ç±»èå´ç馿æ«å符
- æ åéèå´è§å®çå¼å§æç»å°¾ç±»åå
- ç«å³å¨æ åéèå´è§å®ä¹åã
- 以忿 转ä¹ä¸ºå符转ä¹
NonemptyClassRangesNoDash ::
- ClassAtom
- ClassAtomNoDash NonemptyClassRangesNoDash
- ClassAtomNoDash - ClassAtom ClassRanges
ClassAtom ::
-
- - ClassAtomNoDash
- ClassAtomExClass(ä» C++)
- ClassAtomCollatingElement(ä» C++)
- ClassAtomEquivalence(ä» C++)
ClassAtomNoDash ::
- SourceCharacter but not one of
\ or ] or - -
\ClassEscape
æ¯ä¸ªæ æ ç±»åå (ClassAtomNoDash) 表示å个å符ââåç¶çæºå符æè½¬ä¹å¦ä¸çå符ï¼
ClassEscape ::
- DecimalEscape
-
b - CharacterEscape
- CharacterClassEscape
ç¹æ®çç±»è½¬ä¹ (ClassEscape) \b 产çå¹é
ç¼ç åå
U+0008 ï¼éæ ¼ï¼çå符éãå¨å符类å¤ï¼å®æ¯è¯è¾¹çæè¨ã
å符类å
ï¼ \B ç使ç¨åä»»ä½å溯å¼ç¨ï¼å¼äºé¶çåè¿å¶è½¬ä¹ï¼é½æ¯é误ã
为å°å符 - å ] å½åååï¼ä¸äºæ
å½¢ä¸éè¦è½¬ä¹å®ä»¬ãå
¶ä»æ¥æå¨å符类å¤çç¹æ®å«ä¹çå符ï¼ä¾å¦ * æ ? ï¼ä¸éè¦è½¬ä¹ã
| æ¬èæªå®æ åå ï¼ææ ç¤ºä¾ |
åºäº POSIX çå符类
è¿äºå符类æ¯å¯¹ ECMAScript ææ³çæ©å±ï¼å¹¶çä»·äº POSIX æ£å表达å¼ä¸æ¾å°çå符类ã
ClassAtomExClass(ä» C++)Â ::
-
[:ClassName:]
表示ææå
·åå符类类å (ClassName) ä¸çæåãä»
è¥ std::regex_traits::lookup_classname 对æ¤åç§°è¿åéé¶å符串ï¼åç§°æåæ³ãå¦ std::regex_traits::lookup_classname ä¸æè¿°ï¼ä¿è¯è¾¨è¯ä¸ååç§°ï¼ alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit, d, s, w ãé¢å¤çåç§°ï¼å¦æ¥æä¸ç jdigit æ jkanji ï¼å¯ä¸ºç³»ç»æä¾ç locale æä¾ï¼æå®ç°ä¸ºç¨æ·å®ä¹çæ©å±ï¼
ClassAtomCollatingElement(ä» C++)Â ::
-
[.ClassName.]
表示å
·å对ç
§å
ç´ ï¼å®å¯è¡¨ç¤ºå个åç¬¦ï¼æå¨ææç locale ä¸ä½ä¸ºå个åä½å¯¹ç
§çå符åºåï¼ä¾å¦ [.tilde.] ææ·å
æä¸ç [.ch.] ãä»
è¥ std::regex_traits::lookup_collatename 䏿¯ç©ºå符串åç§°æåæ³ã
ä½¿ç¨ std::regex_constants::collate æ¶ï¼å§ç»è½ä»¥å¯¹ç
§å
ç´ ä¸ºèå´ç端ç¹ï¼ä¾å¦åç婿ä¸ç [[.dz.]-g] ï¼ã
ClassAtomEquivalence(ä» C++)Â ::
-
[=ClassName=]
表示ä¸å ·åå¯¹ç §å ç´ ç¸åççä»·ç±»çæææåå符ï¼å³å ¶åçå¯¹ç §å ³é®ä¸å¯¹ç §å ç´ ç±»åææ¥æè ç¸åçå符ãä» è¥ std::regex_traits::lookup_collatename 对该åç§°è¿åé空å符串ï¼ä¸ std::regex_traits::transform_primary 对è°ç¨ std::regex_traits::lookup_collatename çç»æçè¿åå¼ä¸æ¯ç©ºå符串ï¼åç§°æåæ³ã
åçæåºå
³é®æ¯å¿½ç¥å¤§å°åãæ é³ç¬¦ææ¬å°ç¯å¢éå®è£åªçå
³é®ï¼æ
ä¾å¦ [[=a=]] å¹é
ä»»ä½è¿äºå符ä¹ä¸ï¼ a, Ã, Ã, Ã, Ã, Ã, Ã
, A, à , á, â, ã, ä å Ã¥ ã
ClassName(ä» C++)Â ::
- ClassNameCharacter
- ClassNameCharacter ClassName
ClassNameCharacter(ä» C++)Â ::
- SourceCharacter ä½é
. = :ä¹ä¸
