在JAVA中 解析String,形如(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的字串,看所傳入的參數是否在運算式內

來源:互聯網
上載者:User

標籤:java   string   

今天在項目中需要解析一個參數範圍的字串,然後判斷一個傳入參數是否在這個運算式內。因為參數範圍字串是(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的組合,所以我覺得直接去進行split處理比較麻煩,就運用了String轉為 byte[] 再做處理。代碼如下。

不知道大家有沒有更好的處理方式。

package test_lzg;import java.util.ArrayList;import java.util.List;public class A {public static void main(String[] args) {String paramRangeString = "0<p<=10";String paramStr = "11";System.out.println(parseParamRange(paramRangeString, paramStr));paramRangeString = "0<=p<=10";paramStr = "5";System.out.println(parseParamRange(paramRangeString, paramStr));}/** * 解析參數範圍運算式 *  * @param paramRangeString 運算式的字串。運算式可能為(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10) * @param paramStr 需要判斷的參數 * @return */private static boolean parseParamRange(String paramRangeString, String paramStr) {byte[] paramRangeByteArr = paramRangeString.getBytes(); // 將字串轉換為byte[]來處理List<Byte> minNumList = new ArrayList<Byte>();List<Byte> maxNumList = new ArrayList<Byte>();String leftOpt = "";String rightOpt = "";boolean isLeftOpt = true; // 標記是第一次出現還是第二次出現,第一次為truefor (int i = 0, len = paramRangeByteArr.length; i < len; i++) {if (paramRangeByteArr[i] == 60) { // 60 是"<"對應的ascii 碼if (paramRangeByteArr[i + 1] == 61) { // 61 是"="對應的ascii 碼if (isLeftOpt) {leftOpt = "<=";} else {rightOpt = "<=";}i++;} else {if (isLeftOpt) {leftOpt = "<";} else {rightOpt = "<";}}isLeftOpt = false;continue;}if (48 <= paramRangeByteArr[i] && paramRangeByteArr[i] <= 57) { // 48是 "0"的 ascii碼,57是"9"的ascii碼if (isLeftOpt) {minNumList.add(paramRangeByteArr[i]);} else {maxNumList.add(paramRangeByteArr[i]);}}}// 將左邊界的數從list中,放入byte[],方便轉換為Stringbyte[] leftBorder = new byte[minNumList.size()];for (int i = 0, len = minNumList.size(); i < len; i++) {leftBorder[i] = minNumList.get(i);}// 將右邊界的數從list中,放入byte[],方便轉換為Stringbyte[] rightBorder = new byte[maxNumList.size()];for (int i = 0, len = maxNumList.size(); i < len; i++) {rightBorder[i] = maxNumList.get(i);}// 列印測試,看解析是否正確System.out.println(new String(leftBorder) + leftOpt);System.out.println(rightOpt + new String(rightBorder));return judgeParamRange(paramStr, new String(leftBorder), leftOpt, true)&& judgeParamRange(paramStr, new String(rightBorder), rightOpt, false);}/** *  * 判斷參數是否在該範圍 * * @param paramStr 需要判斷的參數 * @param borderParamStr 邊界值 * @param opt 與邊界值相關的符號(< or <=) * @param isLeftBorder 是否是左邊界 * @return */private static boolean judgeParamRange(String paramStr, String borderParamStr, String opt, boolean isLeftBorder) {Float borderParam = Float.valueOf(borderParamStr); // 將邊界值轉換為 FloatFloat param = Float.valueOf(paramStr); // 將需要判斷的參數轉換為Floatif (isLeftBorder) { // 如果為左邊界if ("<".equals(opt)) {if (borderParam >= param) {return false;}} else if ("<=".equals(opt)) {if (borderParam > param) {return false;}}} else { // 否則為右邊界if ("<".equals(opt)) {if (param >= borderParam) {return false;}} else if ("<=".equals(opt)) {if (param > borderParam) {return false;}}}return true;}}


在JAVA中 解析String,形如(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的字串,看所傳入的參數是否在運算式內

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.