正则表达式中间名称初始有或没有它

时间:2017-10-13 09:10:55

标签: regex

我似乎不能正确验证用户FirstName + LastName并检查MiddleName,如下所示:

John Doe - Valid
John M Doe - Valid
John Mr Doe - Invalid
John m Doe - Invalid

因此,MiddleName只能是一个大写字母。

我想出了什么:

  • FirstName + LastName应至少有3个字符 - 确定
  • 应该始终是FirstName和LastName - 确定

无法弄清楚如何检查MiddleName是否只有1个字符。

我目前的正则表达式是这样的:

var isValid = /^((\b[a-zA-Z]{3,40}\b)\s*){2,}$/.test($(this).val());
// ^((\b[a-zA-Z]{3,40}\b)\s*){2,}$ - actual regex

2 个答案:

答案 0 :(得分:3)

您可以使用

/^[a-zA-Z]{3,40}(?:\s[A-Z])?\s[a-zA-Z]{3,40}$/

请参阅regex demo注意{3,40}是一个limiting quantifier,可以匹配3到40次连续出现的量化子模式(即[a-zA-Z]字母模式。如果您不打算要限制名字和姓氏的上限(最大字母数限制),只需删除40

<强>详情

  • ^ - 字符串开头
  • [a-zA-Z]{3,40} - 3到40个ASCII字母
  • (?:\s[A-Z])? - (此处)可选序列
    • \s - 空白
    • [A-Z] - 一个大写 ASCII字母
  • \s - 空白
  • [a-zA-Z]{3,40} - 3到40个ASCII字母
  • $ - 字符串结束。

JS演示:

&#13;
&#13;
var strs = [' John Doe', 'John M Doe', 'John Mr Doe', 'John m Doe'];
var rx = /^[a-zA-Z]{3,40}(?:\s[A-Z])?\s[a-zA-Z]{3,40}$/;
for (var s of strs) {
  console.log(s, "=>", rx.test(s));
}
&#13;
&#13;
&#13;

答案 1 :(得分:2)

试试这个正则表达式:

   NSString *localIdentifier;

   PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

   for (PHAssetCollection *assetCollection in assetCollections) {
       if([[assetCollection localizedTitle] isEqualToString:album]  ){
           localIdentifier = assetCollection.localIdentifier;
           break;
       }

   }

   if(localIdentifier ){
        ///fetch album 
        PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[localIdentifier] options:nil];

   }else{
       ///creat album here

   }

Check here进行演示。

解释它的工作原理:

  • /^[A-Za-z]{3,}\s+([A-Z]\s+)?[A-Za-z]{3,}$/ 字符串的开头。
  • ^检查3个或更多字母。
  • [A-Za-z]{3,}检查一个或多个空格字符。
  • \s+可选择检查一个大写字母字符,后跟一个或多个whitepscae字符。所以它要么匹配一个字母+空格,要么就是空格。
  • ([A-Z]\s+)?再次检查3个或更多字母。
  • [A-Za-z]{3,}字符串结束。