正則表達(dá)式,又稱規(guī)則表達(dá)式。(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。
許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎。正則表達(dá)式這個(gè)概念最初是由Unix中的工具軟件(例如sed和grep)普及開(kāi)的。正則表達(dá)式通常縮寫成“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.dlhighland.cn>張軍個(gè)人網(wǎng)站</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);
/**
* 獲取新字符串占位符對(duì)應(yīng)的值:get(KEY_NEW_PLACEHOLDER_VALUE+占位符名)
*/
public static final String KEY_NEW_PLACEHOLDER_VALUE = "b1bb30d4bab4d8cce00d78283098dabe";
/**
* 獲取原字符串占位符對(duì)應(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
* 替換原來(lái)值的鍵
* @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;
}
// 替換掉所有匹配任何空白字符,包括空格、制表符、換頁(yè)符
// 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");
// 替換開(kāi)始和結(jié)束的空格
// fieldName = fieldName.replaceAll("^ *", "").replaceAll(" *$", "");
fieldName = fieldName.trim();
placeNames += fieldName;
String fieldValue = map.get("fieldValue");
// 替換開(kāi)始和結(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ù)庫(kù)字段
*
* @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);
// 首字母大寫無(wú)需轉(zhuǎn)換
if (text.indexOf(s) == 0) {
continue;
}
if (filter.contains(s)) {
continue;
}
filter.add(s);
text = text.replaceAll(s, "_" + s);
}
}
return text;
}
/**
* 獲取匹配結(jié)果對(duì)象
*
* @param regex
* 正則表達(dá)式
* @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
* 正則表達(dá)式
* @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 = "\\{([^\\{]*=[^\\}]*)\\}";
// 添加匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于 [ \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 )>=''{錄音開(kāi)始時(shí)間=2014-03-01}'' and CONVERT(varchar(10) ,StartedAt,120 )<={錄音結(jié)束時(shí)間=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;
}
}
本文為張軍原創(chuàng)文章,轉(zhuǎn)載無(wú)需和我聯(lián)系,但請(qǐng)注明來(lái)自張軍的軍軍小站,個(gè)人博客http://www.dlhighland.cn
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

