前言
有時我們需要在一大段長文本中過濾出我們需要的字段,或者檢驗該文本是否符合要求(該文本是否是郵箱,鏈接,電話號碼或身份證),這時候就需要用到正則表達式了,當然我們也可以使用 NSPredicate,這不重要,重要的是表達式對于刷選和邏輯判斷來說是十分方便的。
謂詞(NSPredicate)
Predicate(謂語)的意思。NSPredicate類是用來定義邏輯條件約束的獲取或內存中的過濾搜索。原理和用法都類似于SQL中的where,作用相當于數據庫的過濾取
NSPredicate真的是Cocoa的優勢之一。其他語言的第三方庫根本沒法和他比。對于我們這些應用和框架開發者來說,有它作為標準組件使得我們在處理數據時有了很大的優勢。
NSPredicate語法:
- 比較運算符
=、==:判斷兩個表達式是否相等,在謂詞中=和==是相同的意思都是判斷,而沒有賦值這一說
NSNumber *testNumber = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = 123"];
if ([predicate evaluateWithObject:testNumber]) {
NSLog(@"testString:%@", testNumber);
}
我們可以看到輸出的內容為:
2016-01-07 11:12:27.281 PredicteDemo[4130:80412] testString:123
=,=>:判斷左邊表達式的值是否大于或等于右邊表達式的值
<=,=<:判斷右邊表達式的值是否小于或等于右邊表達式的值
:判斷左邊表達式的值是否大于右邊表達式的值
<:判斷左邊表達式的值是否小于右邊表達式的值
!=、<>:判斷兩個表達式是否不相等
BETWEEN:BETWEEN表達式必須滿足表達式 BETWEEN {下限,上限}的格式,要求該表達式必須大于或等于下限,并小于或等于上限
NSNumber *testNumber = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {100, 200}"];
if ([predicate evaluateWithObject:testNumber]) {
NSLog(@"testString:%@", testNumber);
} else {
NSLog(@"不符合條件");
}
輸出結果為:
2016-01-07 11:20:39.921 PredicteDemo[4366:85408] testString:123
- 邏輯運算符
AND、&&:邏輯與,要求兩個表達式的值都為YES時,結果才為YES。
NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];
NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray:%@", filterArray);
輸出結果為:
2016-01-07 11:27:01.885 PredicteDemo[4531:89537] filterArray:(
3,
4
)
OR、||:邏輯或,要求其中一個表達式為YES時,結果就是YES
NOT、 !:邏輯非,對原有的表達式取反
- 字符串比較運算符
BEGINSWITH:檢查某個字符串是否以指定的字符串開頭(如判斷字符串是否以a開頭:BEGINSWITH 'a')
ENDSWITH:檢查某個字符串是否以指定的字符串結尾
CONTAINS:檢查某個字符串是否包含指定的字符串
LIKE:檢查某個字符串是否匹配指定的字符串模板。其之后可以跟?代表一個字符和代表任意多個字符兩個通配符。比如"name LIKE 'ac'",這表示name的值中包含ac則返回YES;"name LIKE '?ac'",表示name的第2、3個字符為ac時返回YES。
MATCHES:檢查某個字符串是否匹配指定的正則表達式。雖然正則表達式的執行效率是最低的,但其功能是最強大的,也是我們最常用的。所以NSPredicate也可以結合正則表達式語句來使用。
注:字符串比較都是區分大小寫和重音符號的。如:café和cafe是不一樣的,Cafe和cafe也是不一樣的。如果希望字符串比較運算不區分大小寫和重音符號,請在這些運算符后使用[c],[d]選項。其中[c]是不區分大小寫,[d]是不區分重音符號,其寫在字符串比較運算符之后,比如:name LIKE[cd] 'cafe',那么不論name是cafe、Cafe還是café上面的表達式都會返回YES。
- 集合運算符
ANY、SOME:集合中任意一個元素滿足條件,就返回YES。
ALL:集合中所有元素都滿足條件,才返回YES。
NONE:集合中沒有任何元素滿足條件就返回YES。如:NONE person.age < 18,表示person集合中所有元素的age>=18時,才返回YES。
IN:等價于SQL語句中的IN運算符,只有當左邊表達式或值出現在右邊的集合中才會返回YES。我們通過一個例子來看一下
NSArray *filterArray = @[@"ab", @"abc"];
NSArray *array = @[@"a", @"ab", @"abc", @"abcd"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];
NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);
代碼的作用是將array中和filterArray中相同的元素去除,輸出為:
2016-01-07 13:17:43.669 PredicteDemo[6701:136206] (
a,
abcd
)
array[index]:返回array數組中index索引處的元素
array[FIRST]:返回array數組中第一個元素
array[LAST]:返回array數組中最后一個元素
array[SIZE]:返回array數組中元素的個數
- 直接量
在謂詞表達式中可以使用如下直接量
FALSE、NO:代表邏輯假
TRUE、YES:代表邏輯真
NULL、NIL:代表空值
SELF:代表正在被判斷的對象自身
"string"或'string':代表字符串
數組:和c中的寫法相同,如:{'one', 'two', 'three'}。
數值:包括證書、小數和科學計數法表示的形式
十六進制數:0x開頭的數字
八進制:0o開頭的數字
二進制:0b開頭的數字
謂詞的用法
構造謂詞 使用正則表達式進行判斷
evaluateWithObject:方法返回的是一個BOOL值,如果符合條件就返回YES,不符合就返回NO。
# 有人說 只有在正則表達式為^表達式$時使用謂詞才是準確的,而不是所有情況都使用。
# 其他情況下會出現判斷錯誤的情況,未親測,有待研究-
使用謂詞過濾集合
# 我想這應該是 NSPredicate 最重要最強大的用處了,對于集合中的條件刷選,我們一般使用 for循環,新建容器, if else 找出目標元素裝入新的容器中。而 NSPredicate 可以使用簡潔的語句就實現如此繁瑣的操作, 的確是省事了不少 NSArray提供了如下方法使用謂詞來過濾集合 - (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSArray集合,返回符合條件的元素組成的新集合 NSMutableArray提供了如下方法使用謂詞來過濾集合 - (void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSMutableArray,剔除集合中不符合條件的元素 NSSet提供了如下方法使用謂詞來過濾集合 - (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSArray中的方法 NSMutableSet提供了如下方法使用謂詞來過濾集合 - (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSMutableArray中的方法。
在謂詞中使用占位符參數
%K:用于動態傳入屬性名
%@:用于動態設置屬性值
詳細用法查看這里
常用 NSPredicate 實例
-
正則判斷手機號碼地址格式
# 手機運營商的號碼有可能添加新號段,所以這樣的驗證方式還是不穩妥的- (BOOL)isMobileNumber:(NSString *)mobileNum { /** * 手機號碼 * 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 * 聯通:130,131,132,152,155,156,185,186 * 電信:133,1349,153,180,189 */ NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$"; /** 10 * 中國移動:China Mobile 11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 12 */ NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$"; /** 15 * 中國聯通:China Unicom 16 * 130,131,132,152,155,156,185,186 17 */ NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$"; /** 20 * 中國電信:China Telecom 21 * 133,1349,153,180,189 22 */ NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$"; /** 25 * 大陸地區固話及小靈通 26 * 區號:010,020,021,022,023,024,025,027,028,029 27 * 號碼:七位或八位 28 */ // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$"; NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; if (([regextestmobile evaluateWithObject:mobileNum] == YES) || ([regextestcm evaluateWithObject:mobileNum] == YES) || ([regextestct evaluateWithObject:mobileNum] == YES) || ([regextestcu evaluateWithObject:mobileNum] == YES)) { if([regextestcm evaluateWithObject:mobileNum] == YES) { NSLog(@"China Mobile"); } else if([regextestct evaluateWithObject:mobileNum] == YES) { NSLog(@"China Telecom"); } else if ([regextestcu evaluateWithObject:mobileNum] == YES) { NSLog(@"China Unicom"); } else { NSLog(@"Unknow"); } return YES; } else { return NO; } } # 簡化版 - (BOOL)checkPhoneNumber:(NSString *)phoneNumber { NSString *regex = @"^[1][3-8]\\d{9}$"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; return [pred evaluateWithObject:phoneNumber]; }
-
驗證email
+(BOOL)isValidateEmail:(NSString *)email { NSString *strRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}"; #或者這個NSString *regex = @"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", strRegex]; return [predicate evaluateWithObject:email]; }
-
驗證電話號碼
+(BOOL)isValidateTelNumber:(NSString *)number {NSString *strRegex = @"[0-9]{1,20}"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", strRegex]; return [predicate evaluateWithObject:number]; }
NSRegularExpression 正則表達式
RegularExpression 的漢語意思就是正則表達式,所以 NSRegularExpression 才是iOS中的正則表達式, 不熟悉的人會錯誤地以為NSPredicate 是正則表達式。下面介紹一下 NSRegularExpression
NSRegularExpression 位于 Foundation 框架中,主要作用相當與檢索條件判斷,但是其強大方便的功能是以晦澀的語法為犧牲的。如果你想仔細研究的話,可以看這倆篇文章:語法列表& 入門教程
如果你看哭了,不要找我,/笑哭
正則表達式最主要的作用是查找刷選、或者替換,當然也可以用來做判斷。numberOfMatchesInString 為0就是沒有一個匹配的目標,也就是 NO 。
NSRegularExpression 的相關方法
# 初始化方法
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error NS_DESIGNATED_INITIALIZER;
# 操作方法
返回所有匹配結果的集合(適合,從一段字符串中提取我們想要匹配的所有數據)
- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回正確匹配的個數(通過等于0,來驗證郵箱,電話什么的,代替NSPredicate)
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回第一個匹配的結果。注意,匹配的結果保存在 NSTextCheckingResult 類型中
- (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
返回第一個正確匹配結果字符串的NSRange
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
block方法 枚舉每個符合約定的字段,通過block對其進行操作
- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
*/
# NSRegularExpression類中提供了方法來實現用新的字段來替換原文中符合規則的字段。
用新字段替換原文本中的對應字段,并返回操作后的NSString
- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
用新字段替換原文本中的對應字段,并返回操作次數(替換字段的個數)
- (NSUInteger)replaceMatchesInString:(NSMutableString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
# NSRegularExpressionOptions;
NSRegularExpressionCaseInsensitive = 1 << 0, // 不區分大小寫的
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, // 忽略空格和# -
NSRegularExpressionIgnoreMetacharacters = 1 << 2, // 整體化
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, // 匹配任何字符,包括行分隔符
NSRegularExpressionAnchorsMatchLines = 1 << 4, // 允許^和$在匹配的開始和結束行
NSRegularExpressionUseUnixLineSeparators = 1 << 5, // (查找范圍為整個的話無效)
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 // (查找范圍為整個的話無效)
};
# NSTextCheckingResult 這是一個文本搜索結果對象里面包含了 Range 屬性 和一個文本搜索類型 的屬性,
我們只需要使用 Range 屬性 即可.
[@"原文本" substringWithRange:range]] 即可獲取匹配到的內容
示例
# 測試字符串,把里面的電話號碼解析出來
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在這里啊啊啊啊s15279107716";
NSError *error = NULL;
// 根據匹配條件,創建了一個正則表達式(類方法,實例方法類似)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}" options:NSRegularExpressionCaseInsensitive error:&error];
if (regex != nil) {
NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
if (firstMatch) {
NSRange resultRange = [firstMatch rangeAtIndex:0];
//從urlString中截取數據
NSString *result = [urlString substringWithRange:resultRange];
NSLog(@"result = %@",result);
}
NSUInteger number = [regex numberOfMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
NSLog(@"number = %ld",number);
[regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOLBOOL *stop) {
NSLog(@"---%@",NSStringFromRange([result range]));
if (flags != NSMatchingInternalError) {
NSRange firstHalfRange = [result rangeAtIndex:0];
if (firstHalfRange.length > 0) {
NSString *resultString1 = [urlString substringWithRange:firstHalfRange];
NSLog(@"result1 = %@",resultString1);
}
}
*stop = YES;
}];
}
需要注意的地方
有些正則表達式 在轉化成字符串時就有出編譯警告,對元字符需要轉譯,比如下面這個驗證郵箱的正則表達式:
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
NSString *regex = @"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
常用正則表達式
(1)^和$屬于特殊符號,前者表示匹配字符串的開頭,后者表示匹配字符串的結尾。
(2)得出.符號表示任一字符(除換行符之外)。
(3)還有\d用來表示任意的單個數字,\w表示任意一個字母或數字或者直接使用0-9的任意數字表示具體數字。而特殊符號?表示前一個字符為0或者1個。
(4)表達式的字符分為兩類:值表達和修飾表達。所謂值表達就是說這個符號表示了某個值,就像\d表示數字,.表示任意非換行符字符。修飾表達用來修飾值達成某種條件,比如{2}表示前面一個值重復兩次,*表示前一個值重復0次或者更多次。
結合例子解釋正則表達式
單語法/字符說明表
值表達
語法 | 意義 |
---|---|
. | 匹配除換行符外的任意字符 |
\w | 匹配字母或者數字的字符 |
\W | 匹配任意不是字母或數字的字符 |
\s | 匹配任意的空白符(空格、制表符、換行符) |
\S | 匹配任意不是空白符的字符 |
\d | 匹配任意數字 |
\D | 匹配任意非數字的字符 |
\b | 匹配單詞的結尾或者開頭的字符 |
\B | 匹配任意不是單詞結尾或開頭的字符 |
[^x] | 匹配任意非x的字符。如[^[a-z]]匹配非小寫字母的任意字符 |
^ | 匹配字符串的開頭 |
$ | 匹配字符串的結尾 |
修飾表達
語法 | 意義 |
---|---|
* | 匹配重復任意次數 |
+ | 匹配重復一次以上的次數 |
? | 匹配一次或零次 |
{n} | 匹配重復n次 |
{n,} | 匹配重復n次或n次以上 |
{n,m} | 匹配重復最少n次最多m次 |
除了這些常見的,想了解更多可以查閱文章上面推薦的一篇語法文章。
以下是摘自一位作者的總結,感覺很不錯,就拿來用了,出自此處
一、校驗數字的表達式
- 數字:^[0-9]*$
- n位的數字:^\d{n}$
- 至少n位的數字:^\d{n,}$
- m-n位的數字:^\d{m,n}$
- 零和非零開頭的數字:^(0|[1-9][0-9]*)$
- 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
- 帶1-2位小數的正數或負數:^(-)?\d+(.\d{1,2})?$
- 正數、負數、和小數:^(-|+)?\d+(.\d+)?$
- 有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$
- 有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$
- 非零的正整數:^[1-9]\d$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]*$
- 非零的負整數:^-[1-9][]0-9″$ 或 ^-[1-9]\d$
- 非負整數:^\d+$ 或 ^[1-9]\d*|0$
- 非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
- 非負浮點數:^\d+(.\d+)?$ 或 ^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$
- 非正浮點數:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$
- 正浮點數:^[1-9]\d.\d|0.\d[1-9]\d$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
- 負浮點數:^-([1-9]\d.\d|0.\d[1-9]\d)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
- 浮點數:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$
二、校驗字符的表達式
- 漢字:^[\u4e00-\u9fa5]{0,}$
- 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
- 長度為3-20的所有字符:^.{3,20}$
- 由26個英文字母組成的字符串:^[A-Za-z]+$
- 由26個大寫英文字母組成的字符串:^[A-Z]+$
- 由26個小寫英文字母組成的字符串:^[a-z]+$
- 由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$
- 由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$
- 中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$
- 中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
- 可以輸入含有%&’,;=?$\”等字符:[%&’,;=?$\x22]+
- 禁止輸入含有~的字符:[^%&’,;=?$\x22]+
三、特殊需求表達式
- Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
- 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
- InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$?%24)
- 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
- 電話號碼(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
- 國內電話號碼(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
- 身份證號(15位、18位數字):^\d{15}|\d{18}$
- 短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
- 帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$
- 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
- 日期格式:^\d{4}-\d{1,2}-\d{1,2}
- 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$
- 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
- 錢的輸入格式:
- 有四種錢的表示形式我們可以接受:”10000.00” 和 “10,000.00”, 和沒有 “分” 的 “10000” 和 “10,000”:^[1-9][0-9]*$
- .這表示任意一個不以0開頭的數字,但是,這也意味著一個字符”0″不通過,所以我們采用下面的形式:^(0|[1-9][0-9]*)$
- .一個0或者一個不以0開頭的數字.我們還可以允許開頭有一個負號:^(0|-?[1-9][0-9]*)$
- .這表示一個0或者一個可能為負的開頭不為0的數字.讓用戶以0開頭好了.把負號的也去掉,因為錢總不能是負的吧.下面我們要加的是說明可能的小數部分:^[0-9]+(.[0-9]+)?$
- .必須說明的是,小數點后面至少應該有1位數,所以”10.”是不通過的,但是 “10” 和 “10.2” 是通過的:^[0-9]+(.[0-9]{2})?$
- 這樣我們規定小數點后面必須有兩位,如果你認為太苛刻了,可以這樣:^[0-9]+(.[0-9]{1,2})?$22 7.這樣就允許用戶只寫一位小數.下面我們該考慮數字中的逗號了,我們可以這樣:^[0-9]{1,3}(,[0-9]{3})(.[0-9]{1,2})?$23 8.1到3個數字,后面跟著任意個 逗號+3個數字,逗號成為可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3}))(.[0-9]{1,2})?$
- 備注:這就是最終結果了,別忘了”+”可以用”*”替代如果你覺得空字符串也可以接受的話(奇怪,為什么?)最后,別忘了在用函數時去掉去掉那個反斜杠,一般的錯誤都在這里
- xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+.[x|X][m|M][l|L]$
- 中文字符的正則表達式:[\u4e00-\u9fa5]
- 雙字節字符:[^\x00-\xff] (包括漢字在內,可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))
- 空白行的正則表達式:\n\s*\r (可以用來刪除空白行)
- HTML標記的正則表達式:<(\S?){FNXX==XXFN}>.?|<.? /> (網上流傳的版本太糟糕,上面這個也僅僅能部分,對于復雜的嵌套標記依舊無能為力)
- 首尾空白字符的正則表達式:\s*|\s*$或(\s)|(\s$) (可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式)
- 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
- 中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼為6位數字)
- IP地址:\d+.\d+.\d+.\d+ (提取IP地址時有用)
- 固定電話
^0\d{2}-?\d{8}$
不管是010-88888888,還是02098989898都能進行正確匹配。 - 密碼應該包括一個或以上的大寫字母以及小寫字母
(.*[A-Z]+.*[a-z]+.*$|.[a-z]+.[A-Z]+.*$)
小結
這算是一篇科普類文章,對自己來說也是一個筆記,以后用到相關的知識可以來此查看,中間引用了其他作者的作品,再次表示感謝,同時也文中也有指明出處。后續會持續更新新的使用方法。(未完 待續........)