码迷,mamicode.com
首页 > 编程语言 > 详细

在JAVA中 解析String,形如(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的字符串,看所传入的参数是否在表达式内

时间:2015-04-13 16:50:22      阅读:112      评论:0      收藏:0      [点我收藏+]

标签: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; // 标记是第一次出现还是第二次出现,第一次为true
		for (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[],方便转换为String
		byte[] leftBorder = new byte[minNumList.size()];
		for (int i = 0, len = minNumList.size(); i < len; i++) {
			leftBorder[i] = minNumList.get(i);
		}

		// 将右边界的数从list中,放入byte[],方便转换为String
		byte[] 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); // 将边界值转换为 Float
		Float param = Float.valueOf(paramStr); // 将需要判断的参数转换为Float
		if (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)的字符串,看所传入的参数是否在表达式内

标签:java   string   

原文地址:http://blog.csdn.net/hunanlzg/article/details/45025713

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!