涉及(統(tǒng)計數(shù)量)這類有語義的就不該用正則了。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比桃城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式桃城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋桃城地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
直接逐個字符過濾反而更快。
按規(guī)則:
1、2、4各最多出現(xiàn)1次或不出現(xiàn);
3最多出現(xiàn)2次以下或不出現(xiàn);
其他符號非法;
設(shè)c計數(shù)
public class Test {
static public boolean validate(String t){
int c[]=new int[4];
for(char ch:t.toCharArray()){
switch(ch){
case '1':case '2':case '3':case '4':
c[ch-'1']++;
if(c[0]1 || c[1]1 || c[3]1 || c[2]2 ) return false;
break;
default:
return false;
}
}
return c[0]=1 c[1]=1 c[2]=2 c[3]=1;
}
static public void main(String argv[]){
String a[]={ "12112","1211","142","1411","133","1321",
"133","1312", "13312", "1362", "1332" };
for(String t:a)
if(validate(t)) System.out.println(t);
}
}
========
142
133
133
1332
========
另你例中有1211,出現(xiàn)有3個1所以不合法。
匹配方式(其中每個方式對應(yīng)RegUtil.java中的一個方法)代碼:
package test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegUtil {
/**
* 方式一:基本正則表達式實現(xiàn)
* @param str
* @param reg
* @return
*/
public static boolean matchMatcher(String str,String reg){
Pattern pattern =Pattern.compile(reg);
Matcher matcher=pattern.matcher(str);
return matcher.matches();
}
/**
* 方式二:利用Pattern自帶實現(xiàn)
* @param str
* @param reg
* @return
*/
public static boolean matchPattern(String str,String reg){
return Pattern.matches(reg, str);
}
/**
* 方式三:String自帶實現(xiàn)
* @param str
* @param reg
* @return
*/
public static boolean matchStr(String str,String reg){
return str.matches(reg);
}
}
對應(yīng)單元測試代碼如下:
package test;
import org.junit.Assert;
import org.junit.Test;
public class TestReg {
@Test
public void testParttern(){
Assert.assertTrue(RegUtil.matchMatcher("123", "http://d+"));
Assert.assertTrue(RegUtil.matchPattern("123", "http://d+"));
Assert.assertTrue(RegUtil.matchStr("123", "http://d+"));
}
}
使用正則表達式的 “零寬度正回顧后發(fā)斷言“這個正則就是匹配以某個指定字符開頭的字段,具體定義你可以去搜索一下,java代碼如下:
String target = "scoreboard objectives setdisplay sidebar R_HT_win";
Pattern pattern = Pattern.compile("(?=scoreboard objectives setdisplay sidebar\\s{1})\\w*");
Matcher matcher = pattern.matcher(target);
String result = null;
if (matcher.find()){
int startIndex = matcher.start();
int endIndex = matcher.end();
result = target.substring(startIndex,endIndex);
}
System.out.println(result);
Pattern pattern = Pattern.compile("^[^\\*]*\\*+.*$");
Matcher matcher = pattern.matcher(你要匹配的字符串);
if(matcher.matches())
{
//TODO:匹配
}
else
{
//TODO:不匹配
}
上面的代碼應(yīng)該可以滿足你的要求,不過你要判斷是否包含一個*。為什么不直接用contains("*") 或者 indexOf("*") 0 呢?呵呵,希望對你有所幫助。
Java中正則表達式匹配的語法規(guī)則:以下是整理出來的Java下運用正則表達式實現(xiàn)匹配的程序案例,代碼如下:package org.luosijin.test;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 正則表達式 * @version V5.0 * @author Admin * @date 2015-7-25 */public class Regex { /** * @param args * @author Admin * @date 2015-7-25 */ public static void main(String[] args) { Pattern pattern = Pattern.compile("b*g"); Matcher matcher = pattern.matcher("bbg"); System.out.println(matcher.matches()); System.out.println(pattern.matches("b*g","bbg")); //驗證郵政編碼 System.out.println(pattern.matches("[0-9]{6}", "200038")); System.out.println(pattern.matches("http://d{6}", "200038")); //驗證電話號碼 System.out.println(pattern.matches("[0-9]{3,4}//-?[0-9]+", "02178989799")); getDate("Nov 10,2009"); charReplace(); //驗證身份證:判斷一個字符串是不是身份證號碼,即是否是15或18位數(shù)字。 System.out.println(pattern.matches("^//d{15}|//d{18}$", "123456789009876")); getString("D:/dir1/test.txt"); getChinese("welcome to china,江西奉新,welcome,你!"); validateEmail("luosijin123@163.com"); } /** * 日期提取:提取出月份來 * @param str * @author Admin * @date 2015-7-25 */ public static void getDate(String str){ String regEx="([a-zA-Z]+)|//s+[0-9]{1,2},//s*[0-9]{4}"; Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(str); if(!matcher.find()){ System.out.println("日期格式錯誤!"); return; } System.out.println(matcher.group(1)); //分組的索引值是從1開始的,所以取第一個分組的方法是m.group(1)而不是m.group(0)。 } /** * 字符替換:本實例為將一個字符串中所有包含一個或多個連續(xù)的“a”的地方都替換成“A”。 * * @author Admin * @date 2015-7-25 */ public static void charReplace(){ String regex = "a+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher("okaaaa LetmeAseeaaa aa booa"); String s = matcher.replaceAll("A"); System.out.println(s); } /** * 字符串提取 * @param str * @author Admin * @date 2015-7-25 */ public static void getString(String str){ String regex = ".+/(.+)$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); if(!matcher.find()){ System.out.println("文件路徑格式不正確!"); return; } System.out.println(matcher.group(1)); } /** * 中文提取 * @param str * @author Admin * @date 2015-7-25 */ public static void getChinese(String str){ String regex = "[//u4E00-//u9FFF]+";//[//u4E00-//u9FFF]為漢字 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); StringBuffer sb = new StringBuffer(); while(matcher.find()){ sb.append(matcher.group()); } System.out.println(sb); } /** * 驗證Email * @param email * @author Admin * @date 2015-7-25 */ public static void validateEmail(String email){ String regex = "[0-9a-zA-Z]+@[0-9a-zA-Z]+//.[0-9a-zA-Z]+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(email); if(matcher.matches()){ System.out.println("這是合法的Email"); }else{ System.out.println("這是非法的Email"); } }}