è§£æè¡¨è¾¾å¼
ä¸ä¸ªç®æ¯è¡¨è¾¾å¼ç± 2 个æ°ååä¸ä¸ªå®ä»¬ä¹é´çè¿ç®ç¬¦ç»æï¼ä¾å¦ï¼
1 + 21.2 * 3.4-3 / -6-2 - 2
è¿ç®ç¬¦ä¸º "+"ã"-"ã"*" æ "/" ä¸ä¹ä¸ã
å¨å¼å¤´ãä¹é´çé¨åææ«å°¾å¯è½æé¢å¤çç©ºæ ¼ã
å建ä¸ä¸ªå½æ° parse(expr)ï¼å®æ¥åä¸ä¸ªè¡¨è¾¾å¼ä½ä¸ºåæ°ï¼å¹¶è¿åä¸ä¸ªå
å« 3 个å
ç´ çæ°ç»ï¼
- 第ä¸ä¸ªæ°å
- è¿ç®ç¬¦
- 第äºä¸ªæ°å
ç¨ä¾ï¼
let [a, op, b] = parse("1.2 * 3.4");
alert(a); // 1.2
alert(op); // *
alert(b); // 3.4
å¹é
æ°åçæ£å表达å¼ï¼-?\d+(\.\d+)?ãæä»¬å¨ä¸ä¸é¢å建äºè¿ä¸ªè¡¨è¾¾å¼ã
æä»¬å¯ä»¥ä½¿ç¨ [-+*/] å¹é
è¿ç®ç¬¦ãè¿å符 - 卿¹æ¬å·ä¸çæåé¢ï¼å 为å¨ä¸é´å®è¡¨ç¤ºå符èå´ï¼èæä»¬åªæ³è®©å
¶è¡¨ç¤ºå符 -ã
å¨ JavaScript æ£åè¡¨è¾¾å¼ /.../ ä¸ï¼æä»¬åºè¯¥å¯¹ / è¿è¡è½¬ä¹ï¼ç¨åæä»¬ä¼å¯¹å
¶è¿è¡å¤çã
æä»¬éè¦ä¸ä¸ªæ°åãä¸ä¸ªè¿ç®ç¬¦ä»¥åå¦ä¸ä¸ªæ°åãå ¶é´å¯è½ä¼æç©ºæ ¼ã
宿´çæ£å表达å¼ä¸ºï¼-?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?ã
å®å
å« 3 个é¨åï¼ä»¥ \s* åéï¼
-?\d+(\.\d+)?ââ 第ä¸ä¸ªæ°åï¼[-+*/]ââ è¿ç®ç¬¦ï¼-?\d+(\.\d+)?ââ 第äºä¸ªæ°åã
为äºä½¿è¿éçæ¯ä¸é¨åæä¸ºç»ææ°ç»ä¸çåç¬å
ç´ ï¼æä»¥æä»¬æå®ä»¬æ¬å¨æ¬å·éï¼(-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?)ã
使ç¨ç¤ºä¾ï¼
let regexp = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;
alert( "1.2 + 12".match(regexp) );
ç»æå æ¬ï¼
result[0] == "1.2 + 12"(宿´çå¹é 项)result[1] == "1.2"(第ä¸ç»(-?\d+(\.\d+)?)ââ 第ä¸ä¸ªæ°åï¼å æ¬å°æ°é¨å)result[2] == ".2"(第äºç»(\.\d+)?ââ 第ä¸ä¸ªæ°åçå°æ°é¨å)result[3] == "+"(第ä¸ç»([-+*\/])ââ è¿ç®ç¬¦)result[4] == "12"(第åç»(-?\d+(\.\d+)?)ââ 第äºä¸ªæ°å)result[5] == undefinedï¼ç¬¬äºç»(\.\d+)?ââ 第äºä¸ªæ°åçå°æ°é¨åä¸åå¨ï¼æä»¥è¿éæ¯ undefinedï¼
æä»¬åªæ³è¦æ°ååè¿ç®ç¬¦ï¼ä¸éè¦å®å ¨å¹é ç以åå°æ°é¨åç»æï¼æä»¥è®©æä»¬ç¨å¾®âæ¸ çâä¸ä¸ç»æã
æä»¬å¯ä»¥ä½¿ç¨æ°ç»ç shift æ¹æ³ result.shift() æ¥å å»å®å
¨å¹é
çç»æï¼æ°ç»ç第ä¸é¡¹ï¼ã
å¯ä»¥éè¿å¨å¼å¤´æ·»å ?: æ¥æé¤å
å«å°æ°é¨åï¼æ°å 2 å 4ï¼(.\d+) çç»ï¼(?:\.\d+)?ã
æç»çè§£å³æ¹æ¡ï¼
function parse(expr) {
let regexp = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;
let result = expr.match(regexp);
if (!result) return [];
result.shift();
return result;
}
alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45