自定义标签:解析化学表达式,并显示出上标与下标.

输入一个化学表达式,返回一个字符串,带有上标与下标,可以在网页中显示出上标与下标.

public String getComposeHTML(String str_value){
		//System.out.print(str_value);
		StringBuffer sb = new StringBuffer();
		int index = 0;
		char[] chars = str_value.toCharArray();
		// 从前往后
		
		for (int i = 1; i < chars.length; i++) {
			// 当前字符是+或-,前一个字符是字母或右括号
			if(chars[i]=='+' || chars[i]=='-' ){
				if(i-1>=0 ){
					if(chars[i-1]==')' 
						|| (chars[i-1]>='A' && chars[i-1]<='Z')
						|| (chars[i-1]>='a' && chars[i-1]<='z')  ){
						sb.append(str_value.substring(index,i));
						index = i+1;
						sb.append("<sup>"+chars[i]+"</sup>");
					}
				}
				continue;
			}else if(chars[i]>='0' && chars[i]<='9'){
				//if(前一个字符是 右括号 或者 前一个字符是字母)
				if(chars[i-1]==')' 
						|| (chars[i-1]>='A' && chars[i-1]<='Z')
						|| (chars[i-1]>='a' && chars[i-1]<='z')  ){

					if( i >= chars.length-1){
						// IF:当前已到结尾了,后面再也没有字符了
						sb.append(str_value.substring(index,i));
						index = i+1;
						sb.append("<sub>"+str_value.substring(i,i+1)+"</sub>");
						break;
					}else {
						// else:当前还没到结尾,后面还有其它的字符
						// for( 循环取后一个字符 ){
						for ( int j=i+1; j < chars.length; j++) {
							if(chars[j]>='0' && chars[j]<='9'){
								// if(后一个字符也是数字) 则继续判断下一个字符
								continue;
							} else if(chars[j]=='+' || chars[j]=='-') {
								// if(后一个字符是+加号或-减号) 则这个数字串是上标
								sb.append(str_value.substring(index,i));
								index = j+1;
								sb.append("<sup>"+str_value.substring(i,j+1)+"</sup>");
								i = j+1;
								break;
							} else {
								// else(后一个字符不是前面所说的情况) 则这个数字串是下标
								sb.append(str_value.substring(index,i));
								index = j;
								sb.append("<sub>"+str_value.substring(i,j)+"</sub>");
								i = j-1;
								break;
							}//~ if-else 根据下一个字符的类型来分别处理
						} //~ for(j++)
					} //~if-else 是否已经是结尾字符
				} //~if 前一个字符是字母或右括号
			} //~ if-else 判断当前字符的类型
		} //~ for(i++)
		if(index<str_value.length()){
			sb.append( str_value.substring(index,str_value.length()));
		}
		
		//System.out.println("  -->  "+sb.toString());
		return sb.toString();
}
 

已知的BUG : 无法  解析 NO3-

猜你喜欢

转载自cooltain.iteye.com/blog/1058420