android開發之Regex

來源:互聯網
上載者:User

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'才被認作一行的中止,並且與'.','^',以及'$'進行匹配。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.