亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

正則工具類

張軍 3241 0

正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學(xué)的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。

許多程序設(shè)計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內(nèi)建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數(shù)有regexp、regex,復(fù)數(shù)有regexps、regexes、regexen。

張軍博客

package zj.regex.util;

import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

/**
 * 類名 :RegexUtil<br>
 * 概況 :正則工具類<br>
 * 
 * @version 1.00 (2014.09.15)
 * @author SHNKCS 張軍 {@link  <a target=_blank href=http://www.eyofj.com>張軍個人網(wǎng)站</a>&nbsp;&nbsp;&nbsp;&nbsp;<a target=_blank href=http://user.qzone.qq.com/360901061/>張軍QQ空間</a>}
 */
public class RegexUtil implements Serializable {
	private static final long serialVersionUID = 1L;
	public static Map<String, String> SPECIALS;
	private transient static final Logger log = Logger.getLogger(RegexUtil.class);
	static {
		SPECIALS = new HashMap<String, String>();
		SPECIALS.put("[", "\\[");
		SPECIALS.put("$", "\\$");
		SPECIALS.put("(", "\\(");
		SPECIALS.put(")", "\\)");
		SPECIALS.put("*", "\\*");
		SPECIALS.put(".", "\\.");
		// SPECIALS.put("[", "\\[");
		// SPECIALS.put("]", "\\]");
		SPECIALS.put("?", "\\?");
		SPECIALS.put("\\", "\\\\");
		SPECIALS.put("|", "\\|");
		SPECIALS.put("{", "\\{");
		SPECIALS.put("}", "\\}");
		// **********************
		SPECIALS.put("'", "\\'");
	}

	public static class FillString {
		// String str = md5.getEncryptString("zhangjun201509010000");
		// System.out.println(str);
		// str = md5.getEncryptString("zhangjun201509010001");
		// System.out.println(str);
		// str = md5.getEncryptString("zhangjun201509010002");
		// System.out.println(str);
		// str = md5.getEncryptString("zhangjun201509010003");
		// System.out.println(str);
		// str = md5.getEncryptString("zhangjun201509010004");
		// System.out.println(str);
		// str = md5.getEncryptString("zhangjun201509010005");
		// System.out.println(str);
		/**
		 * 獲取新字符串占位符對應(yīng)的值:get(KEY_NEW_PLACEHOLDER_VALUE+占位符名)
		 */
		public static final String KEY_NEW_PLACEHOLDER_VALUE = "b1bb30d4bab4d8cce00d78283098dabe";
		/**
		 * 獲取原字符串占位符對應(yīng)的值:get(KEY_ORIGINAL_PLACEHOLDER_VALUE+占位符名)
		 */
		public static final String KEY_ORIGINAL_PLACEHOLDER_VALUE = "024110d8c905229ba6b01667cd2fe316";
		/**
		 * 獲取新字符串值的key:get(KEY_NEW_VALUE)
		 */
		public static final String KEY_NEW_VALUE = "f8e4e87efbb70a29018eb9a106a8c22d";
		/**
		 * 獲取原字符串值的key:get(KEY_ORIGINAL_VALUE)
		 */
		public static final String KEY_ORIGINAL_VALUE = "ad8fea661188b29cf2ffe3c8fe5121cd";
		/**
		 * 所有占位符名:get(KEY_PLACEHOLDER_NAMES),以KEY_PLACEHOLDER_NAMES_SPLIT分割
		 */
		public static final String KEY_PLACEHOLDER_NAMES = "824ff4fec41a74aa8da8873c403d816d";
		/**
		 * 占位符名分割符
		 */
		public static final String KEY_PLACEHOLDER_NAMES_SPLIT = "052b9e211243c0937871d8b296616d53";
		/**
		 * 所有占位符:get(KEY_PLACEHOLDER),以KEY_PLACEHOLDER_SPLIT分割
		 */
		public static final String KEY_PLACEHOLDER = "d72a3113b65fc8984ac1a346490427dd";
		/**
		 * 占位符分割符
		 */
		public static final String KEY_PLACEHOLDER_SPLIT = "052b9e211243c0937871d8b296616d53";
	}

	/**
	 * 占位符=值
	 * 
	 * @param keyOriginalValue
	 *            原始值
	 * @param nameValueMap
	 *            鍵值替換
	 * @return
	 * @throws Exception
	 */
	public static Map<String, String> fillString(String keyOriginalValue, Map<String, String> nameValueMap) throws Exception {
		return fillString(keyOriginalValue, nameValueMap, null);
	}

	/**
	 * 占位符=值
	 * 
	 * @param keyOriginalValue
	 *            原始值
	 * @param nameValueMap
	 *            鍵值替換
	 * @param replaceOriginalValueKeys
	 *            替換原來值的鍵
	 * @return
	 * @throws Exception
	 */
	public static Map<String, String> fillString(String keyOriginalValue, Map<String, String> nameValueMap, Set<String> replaceOriginalValueKeys) throws Exception {
		Map<String, String> rtnMap = new HashMap<String, String>();
		if (keyOriginalValue != null && !"".equals(keyOriginalValue)) {
			String places = "";
			String placeNames = "";
			String keyNewValue = keyOriginalValue;
			Matcher m = null;
			m = getMatcher(keyOriginalValue);
			while (m.find()) {
				String nameValueGroup = m.group(0);
				// name = m.group(1);
				if (nameValueGroup == null || nameValueGroup.equals("")) {
					continue;
				}
				// 替換掉所有匹配任何空白字符,包括空格、制表符、換頁符
				// nameValueGroup = nameValueGroup.replaceAll("\\s*", "");
				String nameValue = nameValueGroup;
				if (!"".equals(places)) {
					places += RegexUtil.FillString.KEY_PLACEHOLDER_SPLIT;
				}
				places += nameValueGroup;
				if (nameValueGroup.length() > 1) {
					nameValue = nameValueGroup.substring(1, nameValueGroup.length() - 1);
				}
				Map<String, String> map = getPlaceHodlder(nameValue);
				if (!"".equals(placeNames)) {
					placeNames += RegexUtil.FillString.KEY_PLACEHOLDER_NAMES_SPLIT;
				}
				String fieldName = map.get("fieldName");
				// 替換開始和結(jié)束的空格
				// fieldName = fieldName.replaceAll("^ *", "").replaceAll(" *$", "");
				fieldName = fieldName.trim();
				placeNames += fieldName;
				String fieldValue = map.get("fieldValue");
				// 替換開始和結(jié)束的空格
				fieldValue = fieldValue.trim();
				String value = null;
				boolean isReplace = false;
				if (replaceOriginalValueKeys != null && replaceOriginalValueKeys.contains(fieldName)) {
					// 替換原值
					value = fieldValue;
					isReplace = true;
				} else {
					if (nameValueMap != null && nameValueMap.size() > 0 && nameValueMap.containsKey(fieldName)) {
						value = nameValueMap.get(fieldName);
						isReplace = true;
					}
				}
				value = value == null ? "" : value;
				if (isReplace) {
					keyNewValue = keyNewValue.replaceFirst(formatSpecial("{" + nameValue + "}"), value);
					rtnMap.put(RegexUtil.FillString.KEY_NEW_PLACEHOLDER_VALUE + fieldName, value);
				}
				rtnMap.put(RegexUtil.FillString.KEY_ORIGINAL_PLACEHOLDER_VALUE + fieldName, fieldValue);
				log.debug("占位符名值組=" + nameValueGroup + ",占位符名值=" + nameValue + ",占位符名值=" + nameValue + ",占位符名=" + fieldName + ",占位符原值=" + fieldValue + ",占位符新值=" + value);
			}
			rtnMap.put(RegexUtil.FillString.KEY_ORIGINAL_VALUE, keyOriginalValue);
			rtnMap.put(RegexUtil.FillString.KEY_NEW_VALUE, keyNewValue);
			log.debug("原字符串值:" + keyOriginalValue + ",新字符串值:" + keyNewValue);
			log.debug("取原占位符值=返回值.get(RegexUtil.FillString.KEY_ORIGINAL_PLACEHOLDER_VALUE +占位符名),取新占位符值=返回值.get(RegexUtil.FillString.KEY_NEW_PLACEHOLDER_VALUE +占位符名)");
			log.debug("取原字符串=返回值.get(RegexUtil.FillString.KEY_ORIGINAL_VALUE),取新字符串=返回值.get(RegexUtil.FillString.KEY_NEW_VALUE)");
			rtnMap.put(RegexUtil.FillString.KEY_PLACEHOLDER, places);
			rtnMap.put(RegexUtil.FillString.KEY_PLACEHOLDER_NAMES, placeNames);
		}
		return rtnMap;
	}

	/**
	 * 占位符=值
	 * 
	 * @param str
	 * @return
	 */
	public static Map<String, String> fillString(String keyOriginalValue) throws Exception {
		return fillString(keyOriginalValue, null);
	}

	/**
	 * 獲取{占位符=值}名值
	 * 
	 * @param nameValue
	 * @return
	 */
	private static Map<String, String> getPlaceHodlder(String nameValue) {
		Map<String, String> rtnMap = new HashMap<String, String>();
		String fieldName = "";
		String fieldValue = "";
		int index = nameValue.indexOf("=");
		if (index == -1) {
			fieldName = nameValue;
		} else {
			fieldName = nameValue.substring(0, index);
			fieldValue = nameValue.substring(index + 1);
		}
		rtnMap.put("fieldName", fieldName);
		rtnMap.put("fieldValue", fieldValue);
		return rtnMap;
	}

	/**
	 * 轉(zhuǎn)換java屬性為數(shù)據(jù)庫字段
	 * 
	 * @param text
	 * @return
	 */
	public static String convertJavaToDbField(String text) {
		Matcher m = getMatcher("([A-Z])", text);
		Set<String> filter = new HashSet<String>();
		while (m.find()) {
			for (int i = 0; i < m.groupCount(); i++) {
				String s = m.group(i);
				// 首字母大寫無需轉(zhuǎn)換
				if (text.indexOf(s) == 0) {
					continue;
				}
				if (filter.contains(s)) {
					continue;
				}
				filter.add(s);
				text = text.replaceAll(s, "_" + s);
			}
		}
		return text;
	}

	/**
	 * 獲取匹配結(jié)果對象
	 * 
	 * @param regex
	 *            正則表達式
	 * @param text
	 *            文本
	 * @author 張軍
	 * @date 2015-11-03 21:59:00
	 * @modifiyNote
	 * @version 1.0
	 * @return
	 */
	public static Matcher getMatcher(String regex, String text) {
		Pattern pattern = Pattern.compile(regex);
		Matcher result = pattern.matcher(text);
		return result;
	}

	/**
	 * 獲取匹配結(jié)果(全部)
	 * 
	 * @param regex
	 *            正則表達式
	 * @param text
	 *            文本
	 * @author 張軍
	 * @date 2015-11-03 21:59:00
	 * @modifiyNote
	 * @version 1.0
	 * @return
	 */
	public static boolean getMatcherResult(String regex, String text) {
		Matcher result = getMatcher(regex, text);
		return result.matches();
	}

	/**
	 * 獲取匹配
	 * 
	 * @param str
	 * @return
	 */
	public static Matcher getMatcher(String str) {
		Matcher m = null;
		String pile = null;
		// pile = "\\{((([\\w]*)|([\u4E00-\u9FA5]*))*)\\}";
		// pile = "\\{([^\\{|^\\}*]*=[^\\{|^\\}*]*)*\\}";
		// pile = "\\{([^\\{*]*=[^\\}*]*)\\}";
		// pile = "\\{([^{*]*=[^}*]*)\\}";
		// pile = "\\{([^\\{|^\\}*]*=[^\\{|^\\}*]*)\\}";
		// 第一次版本
		// pile = "\\{([^\\{|^\\}]*=[^\\{|^\\}]*)\\}";
		// 第二次版本
		// pile = "\\{([^\\{]*=[^\\}]*)\\}";
		// 添加匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。
		// // 第三次版本
		// pile = "\\{(\\s*[^\\{\\s]*\\s*=\\s*[^\\}\\s]*\\s*)\\}";
		// 第四次版本
		// pile = "\\{( *[^\\{\\s]* *= *[^\\}\\s]* *)\\}";
		// 第五次版本
		// pile = "\\{(?: *[^\\{\\s]* *= *[^\\}\\s]* *)\\}";
		// 第六次版本
		pile = "\\{([^\\{\\}]*)\\}";
		// str = "and INUM>''{INUM最大值=本地系統(tǒng)最大值}''  and INUM like ''{INUM前綴=604766,600418}'' and userField1=''1'' and CONVERT(varchar(10) ,StartedAt,120 )>=''{錄音開始時間=2014-03-01}'' and CONVERT(varchar(10) ,StartedAt,120 )<={錄音結(jié)束時間=CONVERT(varchar(10) ,DATEADD(day, -1, getDate() ),120 )}";
		m = Pattern.compile(pile).matcher(str);
		return m;
	}

	/***
	 * 格式化特殊字符
	 * 
	 * @param special
	 * @return
	 */
	public static String formatSpecial(String special) {
		if (special == null || special.equals(""))
			return "";
		String newSpecial = "";
		for (int i = 0; i < special.length(); i++) {
			char at = special.charAt(i);
			String skey = String.valueOf(at);
			String rspecial = SPECIALS.get(skey);
			if (rspecial == null) {
				newSpecial += skey;
			} else {
				newSpecial += rspecial;
			}
			// switch (at) {
			// case '{'=
			// newSpecial += "\\{";
			// break;
			// case '}'=
			// newSpecial += "\\}";
			// break;
			// case '('=
			// newSpecial += "\\(";
			// break;
			// case ')'=
			// newSpecial += "\\)";
			// break;
			// case '['=
			// newSpecial += "\\[";
			// break;
			// default=
			// newSpecial += at;
			// }
		}
		return newSpecial;
	}
}



更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人黄色一级片 | 91一区二区在线观看精品 | 久久香蕉国产线看观看乱码 | 国产一区二区三区在线免费 | 999热这里全都是精品 | 久久免费福利视频 | 97影院理论片在线观看 | 99免费精品| 欧美成人啪啪看片 | 天啪天干在线视频 | 国产一区免费视频 | 91中文字幕在线一区 | 老司机午夜免费影院 | 日韩久久中文字幕 | 亚洲高清视频在线观看 | 精品日韩二区三区精品视频 | 在线视频自拍 | 欧美日本一区 | 精品一区精品二区 | 国产高清不卡一区二区 | 欧美激情久久久久久久大片 | 成人午夜影视全部免费看 | 精品视频入口 | 欧美成人手机在线视频 | 91大神在线精品视频一区 | 97精品一区二区三区在线不卡 | 天天久久狠狠色综合 | 亚洲天堂国产精品 | 成人影院午夜久久影院 | 伊人国产精品 | 国产视频最新 | 国产伦精品一区二区三区无广告 | 黄片毛片在线观看 | 国产精品剧情原创麻豆国产 | 国产精品国产三级国产a | 欧美在线国产 | 亚洲视频在线a视频 | 99re6在线视频免费精品 | 欧美成人性色大片在线观看 | 在线看h| 久久免费国产 |