editTextRegex的使用 檢查輸入是否符合規則
| 代碼如下 |
複製代碼 |
import Android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; /** * Class which shows how to validate user input with regular expression * * @author FaYnaSoft Labs */ public class Main extends Activity { private EditText editText; private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); editText = (EditText) findViewById(R.id.textId); editText.setText("EditText element"); button = (Button) findViewById(R.id.btnId); button.setText("Check"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(checkString(editText.getText().toString())) { editText.setText("Corect"); } } }); } /** * This method checks if String is correct * @param s - String which need to check * @return value of matching */ private boolean checkString(String s) { return s.matches("\w*[.](Java|cpp|class)"); } } Regex尋找字元 文章分類:移動開發 String s_Result="Distance: 2.8km (about 9 mins)"; //Distance parsing Pattern p = Pattern.compile("Distance: (\d+(\.\d+)?)(.*?)\b"); Matcher m = p.matcher(s_Result); if(m.find()){ MatchResult mr=m.toMatchResult(); f_Distance=mr.group(1);//2.8 m_DistanceUnit=mr.group(3);//km } //Time parsing p = Pattern.compile("about (\d+(\.\d+)?) (.*)\b"); m = p.matcher(s_Result); if(m.find()){ MatchResult mr=m.toMatchResult(); f_timeEst=mr.group(1);//9 m_timeEstUnit=mr.group(3);//min } 或者 String s_Result="Distance: 2.8km (about 9 mins)"; Pattern p = Pattern.compile("(\d+(\.\d+)?) ?(\w+?)\b"); Matcher m = p.matcher(s_Result); while(m.find()){ MatchResult mr=m.toMatchResult(); String value=mr.group(1);//2.8 and 9 come here String units=mr.group(3);//km and mins come here } |
Regex以過濾特殊字元
在網上找了好久也沒找到個合適的Regex以過濾特殊字元;自己學習了下,寫了兩個,實現要求。
Java 代碼
// 過濾特殊字元
| 代碼如下 |
複製代碼 |
public static String StringFilter(String str) throws PatternSyntaxException { // 只允許字母和數字 // String regEx = "[^a-zA-Z0-9]"; // 清除掉所有特殊字元 String regEx="[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); } @Test public void testStringFilter() throws PatternSyntaxException { String str = "*adCVs*34_a _09_b5*[/435^*&城池()^$$&*). {}+.|.)%%*(*.中國}34{45[]12.fd'*&999下面是中文的字元¥……{}【】。,;’“‘”?"; System.out.println(str); System.out.println(StringFilter(str)); } |
// 過濾特殊字元
| 代碼如下 |
複製代碼 |
| public static String StringFilter(String str) throws PatternSyntaxException { // 只允許字母和數字 // String regEx = "[^a-zA-Z0-9]"; // 清除掉所有特殊字元 String regEx="[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……&*()——+| {}【】‘;:”“’。,、?]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); } @Test public void testStringFilter() throws PatternSyntaxException { String str = "*adCVs*34_a _09_b5*[/435^*&城池()^$$&*).{}+.|.)%%*(*.中國}34{45[]12.fd'*&999 下面是中文的字元¥……{}【】。,;’“‘”?"; System.out.println(str); System.out.println(StringFilter(str)); } |
用的是JUnit測試的,當然你可以改成main
JavaRegex學習:
因為Regex是一個很龐雜的體系,此例僅舉些入門的概念,更多的請參閱相關書籍及自行摸索。
\ 反斜線
t 間隔 ('u0009')
n 換行 ('u000A')
r 斷行符號 ('u000D')
d 數字 等價於[0-9]
D 非數字 等價於[^0-9]
s 空白符號 [tnx0Bfr]
S 非空白符號 [^tnx0Bfr]
w 單獨字元 [a-zA-Z_0-9]
W 非單獨字元 [^a-zA-Z_0-9]
f 換頁符
e Escape
b 一個單詞的邊界
B 一個非單詞的邊界
G 前一個匹配的結束
^為限制開頭
^java 條件限制為以Java為開頭字元
$為限制結尾
java$ 條件限制為以java為結尾字元
. 條件限制除n以外任意一個單獨字元
java.. 條件限制為java後除換行外任意兩個字元
加入特定限制條件「[]」
[a-z] 條件限制在小寫a to z範圍中一個字元
[A-Z] 條件限制在大寫A to Z範圍中一個字元
[a-zA-Z] 條件限制在小寫a to z或大寫A to Z範圍中一個字元
[0-9] 條件限制在小寫0 to 9範圍中一個字元
[0-9a-z] 條件限制在小寫0 to 9或a to z範圍中一個字元
[0-9[a-z]] 條件限制在小寫0 to 9或a to z範圍中一個字元(交集)
[]中加入^後加再次限制條件「[^]」
[^a-z] 條件限制在非小寫a to z範圍中一個字元
[^A-Z] 條件限制在非大寫A to Z範圍中一個字元
[^a-zA-Z] 條件限制在非小寫a to z或大寫A to Z範圍中一個字元
[^0-9] 條件限制在非小寫0 to 9範圍中一個字元
[^0-9a-z] 條件限制在非小寫0 to 9或a to z範圍中一個字元
[^0-9[a-z]] 條件限制在非小寫0 to 9或a to z範圍中一個字元(交集)
在限制條件為特定字元出現0次以上時,可以使用「*」
J* 0個以上J
.* 0個以上任一字元
J.*D J與D之間0個以上任一字元
在限制條件為特定字元出現1次以上時,可以使用「+」
J+ 1個以上J
.+ 1個以上任一字元
J.+D J與D之間1個以上任一字元
在限制條件為特定字元出現有0或1次以上時,可以使用「?」
JA? J或者JA出現
限制為連續出現指定次數字元「{a}」
J{2} JJ
J{3} JJJ
文字a個以上,並且「{a,}」
J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J並存)
文字個以上,b個以下「{a,b}」
J{3,5} JJJ或JJJJ或JJJJJ
兩者取一「|」
J|A J或A
Java|Hello Java或Hello
「()」中規定一個組合類別型
比如,我查詢<a href="index.html">http://www.111cn.net </a>中<a href></a>間的資料,可寫作<a.*href=".*">(.+?)</a>
在使用Pattern.compile函數時,可以加入控制Regex的匹配行為的參數:
Pattern Pattern.compile(String regex, int flag)
flag的取值範圍如下:
Pattern.CANON_EQ 若且唯若兩個字元的"正規分解(canonical decomposition)"都完全相同的情況下,才認定匹配。比如用了這個標誌之後,運算式"au030A"會匹配"?"。預設情況下,不考慮"規 範相等性(canonical equivalence)"。
Pattern.CASE_INSENSITIVE(?i) 預設情況下,大小寫不明感的匹配只適用於US-ASCII字元集。這個標誌能讓運算式忽略大小寫進行匹配。要想對Unicode字元進行大小不明感的匹 配,只要將UNICODE_CASE與這個標誌合起來就行了。
Pattern.COMMENTS(?x) 在這種模式下,匹配時會忽略(Regex裡的)空白字元(譯者註:不是指運算式裡的"\s",而是指運算式裡的空格,tab,斷行符號之類)。注釋從#開 始,一直到這行結束。可以通過嵌入式的標誌來啟用unix行模式。
Pattern.DOTALL(?s) 在這種模式下,運算式'.'可以匹配任一字元,包括表示一行的結束符。預設情況下,運算式'.'不匹配行的結束符。
Pattern.MULTILINE
(?m) 在這種模式下,'^'和'$'分別匹配一行的開始和結束。此外,'^'仍然匹配字串的開始,'$'也匹配字串的結束。預設情況下,這兩個運算式僅僅匹 配字串的開始和結束。
Pattern.UNICODE_CASE
(?u) 在這個模式下,如果你還啟用了CASE_INSENSITIVE標誌,那麼它會對Unicode字元進行大小寫不明感的匹配。預設情況下,大小寫不敏感的 匹配只適用於US-ASCII字元集。
Pattern.UNIX_LINES(?d) 在這個模式下,只有'n'才被認作一行的中止,並且與'.','^',以及'$'進行匹配。