使用正则表达式判断字符串是否符合四则混合运算规则。
1 2 3 4 5 6 7 8 9
| "[^0-9\\.\\+\\-\\*\\/\\(\\)]" "[\\+\\-\\*\\/][)]|[)][0-9.]" "[0-9\\.][(]|[(][\\*\\/]" "\\.[0-9]*\\." "[\\+\\-\\*\\/]\\.{1,}[\\+\\-\\*\\/]" "[\\+\\-\\*\\/][\\*\\/]|[\\+\\-\\*\\/][\\+\\-][\\+\\-\\*\\/]" "^[\\*\\/]|[\\+\\-\\*\\/]$"
|
符合以上条件的大概就是正确的四则混合运算字符串了。如有遗漏请回贴指正谢谢。
下面是程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
| BOOL Arithmetic::IsExpressionsTrue(void) { int length = m_expression.GetLength(); if (length <= 0) { m_szError += _T("表达式长度为0\n"); return FALSE; } if (OnlyDecimalPointIn2Opetator()) { m_szError += _T("运算符号间只有小数点!\n"); return FALSE; } if (IsHaveOtherChar()) { m_szError += _T("表达式中存在非法字符\n"); return FALSE; } if (!IsArithmeticPointRight()) { m_szError += _T("数字中小数点多于1个\n"); return FALSE; } if (!VerifyParenthesis()) { m_szError += _T("表达式中括号不匹配\n"); return FALSE; } if (ParenthesisErroe()) { m_szError += _T("括号使用有问题有如下格式:数字(运算符)数字\n"); return FALSE; } if (BeginOrEndHaveOperator()) { m_szError += _T("表达式开始或结束有运算符号\n"); return FALSE; } return TRUE; }
BOOL Arithmetic::Calculation(double& outValue) { typedef BOOL (PASCAL EXPORT *GetArithmeticResult)(const CString&, double&); HINSTANCE hDLL = NULL; hDLL = LoadLibrary(_T("GetArithmeticResult.dll")); if (NULL != hDLL) { GetArithmeticResult GetValue =(GetArithmeticResult)GetProcAddress(hDLL, _T("GetArithmeticResult")); if (NULL != GetValue ) { if (GetValue(m_expression, outValue)) { return TRUE; } else { m_szError += _T("运算出现错误!"); return FALSE; } } else { m_szError += _T("取GetArithmeticResult函数错误!"); return FALSE; } FreeLibrary(hDLL); } else { m_szError += _T("加载GetArithmeticResult.dll错误!"); return FALSE; } }
BOOL Arithmetic::VerifyParenthesis(void) { boost::regex reg(_T("[(][)]")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return FALSE; } int n = 0; int length = m_expression.GetLength(); for (int i = 0; i < length; ++i) { if ('(' == m_expression[i]) { ++n; } else if (')' == m_expression[i]) { if (0 == n) { return FALSE; } else { --n; } } } if (0 == n) { return TRUE; } return FALSE; }
BOOL Arithmetic::IsHaveOtherChar(void) { boost::regex reg(_T("[^\\+\\-\\*\\/\\(\\)\\.0-9]")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return TRUE; } return FALSE; }
BOOL Arithmetic::BeginOrEndHaveOperator(void) { boost::regex reg(_T("^[\\*\\/]|[\\+\\-\\*\\/]$")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return TRUE; } return FALSE; }
BOOL Arithmetic::IsOperatorTooMuch(void) { boost::regex reg(_T("[\\+\\-\\*\\/][\\*\\/]|[\\+\\-\\*\\/][\\+\\-][\\+\\-\\*\\/]")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return TRUE; } return FALSE; }
BOOL Arithmetic::ParenthesisErroe(void) { boost::regex reg(_T("[0-9\\.][(]|[(][\\*\\/]|[\\+\\-\\*\\/][)]|[)][0-9\\.]")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return TRUE; } return FALSE; }
BOOL Arithmetic::IsArithmeticPointRight(void) { boost::regex reg(_T("[\\.][0-9]*[\\.]")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return FALSE; } return TRUE; }
BOOL Arithmetic::OnlyDecimalPointIn2Opetator(void) { boost::regex reg(_T("[\\+\\-\\*\\/]\\.{1,}[\\+\\-\\*\\/]")); std::string str; str = m_expression; if (boost::regex_search(str, reg)) { return TRUE; } return FALSE; }
|