在JAVA中 解析String,形如(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的字符串,看所传入的参数是否在表达式内_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 在JAVA中 解析String,形如(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的字符串,看所传入的参数是否在表达式内

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

 2015/4/13 18:38:08  hunanlzg  程序员俱乐部  我要评论(0)
  • 摘要:今天在项目中需要解析一个参数范围的字符串,然后判断一个传入参数是否在这个表达式内。因为参数范围字符串是(0<p<10or0<=p<10or0<p<=10or0<=p<=10)的组合,所以我觉得直接去进行split处理比较麻烦,就运用了String转为byte[]再做处理。代码如下。不知道大家有没有更好的处理方式。packagetest_lzg;importjava.util.ArrayList;importjava.util.List
  • 标签:Java 字符串 表达式 解析
今天在项目中需要解析一个参数范围的字符串,然后判断一个传入参数是否在这个表达式内。因为参数范围字符串是(0<p<10 or 0<=p<10 or 0<p<=10 or 0<=p<=10)的组合,所以我觉得直接去进行split处理比较麻烦,就运用了String转为 byte[] 再做处理。代码如下。
不知道大家有没有更好的处理方式。
class="java" name="code">
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;
	}
}

发表评论
用户名: 匿名