E.g:
isValidCppIdentifier("_foo") // returns true
isValidCppIdentifier("9bar") // returns false
isValidCppIdentifier("var'") // returns false
我写了一些快速代码,但它失败了:
我的正则表达式是"[a-zA-Z_$][a-zA-Z0-9_$]*"
我只是做regex.IsMatch(inputString)
。
谢谢..
答案 0 :(得分:1)
它应该可以使用一些额外的锚定:
"^[a-zA-Z_][a-zA-Z0-9_]*$"
如果您确实需要使用Unicode支持荒谬的标识符,请随意阅读标准的各种版本之一并将所有范围添加到正则表达式中(例如,http://www-d0.fnal.gov/~dladams/cxx_standard.pdf的页面713和714)< / p>
答案 1 :(得分:1)
Matti的答案将在插入到C ++代码之前清理标识符,但不会很好地处理C ++代码作为输入。分开L"wchar_t string"
之类的内容会很烦人,其中L
不是标识符。还有Unicode。
Clang,Apple的编译器基于模块化哲学,提供了set of tokenizer functions。看起来您需要clang_createTranslationUnitFromSourceFile
和clang_tokenize
。
我没有检查它是否处理\Uxxxx
或其他任何东西。不能做任何一种保证。上次我使用LLVM是在五年前,这不是最好的经历......但也不是最差的。
另一方面,GCC certainly has it,虽然您必须弄清楚如何使用cpp_lex_direct。