正則表達式,又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。
許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex,復數有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://m.eyofj.com>張軍個人網站</a> <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); /** * 獲取新字符串占位符對應的值:get(KEY_NEW_PLACEHOLDER_VALUE+占位符名) */ public static final String KEY_NEW_PLACEHOLDER_VALUE = "b1bb30d4bab4d8cce00d78283098dabe"; /** * 獲取原字符串占位符對應的值: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"); // 替換開始和結束的空格 // fieldName = fieldName.replaceAll("^ *", "").replaceAll(" *$", ""); fieldName = fieldName.trim(); placeNames += fieldName; String fieldValue = map.get("fieldValue"); // 替換開始和結束的空格 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; } /** * 轉換java屬性為數據庫字段 * * @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); // 首字母大寫無需轉換 if (text.indexOf(s) == 0) { continue; } if (filter.contains(s)) { continue; } filter.add(s); text = text.replaceAll(s, "_" + s); } } return text; } /** * 獲取匹配結果對象 * * @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; } /** * 獲取匹配結果(全部) * * @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最大值=本地系統最大值}'' and INUM like ''{INUM前綴=604766,600418}'' and userField1=''1'' and CONVERT(varchar(10) ,StartedAt,120 )>=''{錄音開始時間=2014-03-01}'' and CONVERT(varchar(10) ,StartedAt,120 )<={錄音結束時間=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; } }
本文為張軍原創文章,轉載無需和我聯系,但請注明來自張軍的軍軍小站,個人博客http://m.eyofj.com
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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