JavaScript:正则表达式 - 无法使用标点符号开头/结尾,没有重复的标点符号

时间:2016-02-27 06:13:44

标签: javascript regex

我试图创建一个正则表达式。规则是:

1)只有字母(上下),数字,句号(。)和下划线(_)

2)必须以字母或数字开头和结尾(即没有句号/下划线)

3)连续不能有多个标点符号(无..或._或_。或__或.._等。)

4)必须至少包含2个字母(上面或下面或两者都有,并不重要)

5)不少于3个字符,不超过25个字符

到目前为止,我所拥有的是:

^((?!.*[\._]{2})[A-Za-z0-9\._]{3,25})$

这是近在咫尺。我已经获得了规则1,3和5,但无法弄清楚2和4。

我以为

(([A-Za-z0-9]?)([A-Za-z0-9\._]+)([A-Za-z0-9]?)){3,25}

会得到规则2,但它只会破坏它。

我已经在这上工作了几个小时,但我找不到或者想出的任何解决方案都不是我想要的。

对您提供的正则表达式声明的解释将非常感激,但并非完全必要。

编辑1

根据noob的建议:

^((?!.*[\._]{2})(([\w\d\.]+)){3,25})$

编辑2

有效:

1rockit.man
q3w
e4.45r.d.2
sp_am

(以及3到25个字符之间的任何其他内容,不带引号或重复标点符号)

无效:

.ret.
123
12a
ret..wer
super_.duper
_petrat
petrat_

4 个答案:

答案 0 :(得分:7)

根据您的条件,我提出了以下正则表达式。它只是对你当前正则表达式的修改。

正则表达式: ^(?=.*[A-Za-z].*[A-Za-z])([A-Za-z0-9]((?!.*[\._]{2})([\w\d\.]{1,23}))[A-Za-z0-9])$

说明:

  • 第一部分(?=.*[A-Za-z].*[A-Za-z])检查整个字符串是否有 two 字符,用任何分隔(这几乎就是这里的情况) )。

  • 我在字符串的开头和结尾添加了检查,该检查应该是字母数字

  • 除此之外,长度也会因为第一个和最后一个字符的计算而有所不同,其余长度仅为 23个字符

Regex101 Demo

答案 1 :(得分:4)

根据规则构建正则表达式(按顺序排列):

  • 大写和小写=>用例不敏感标记//i
  • 字母,数字,下划线和句号=> [\w.]*
  • 3-25个字符=> ^[\w.]{3,25}$
  • 无法以句点或下划线开头或结尾=> (?!^[\W_]|[W_]$)
    (注意大写\W含义not \w
  • 连续不能包含2个标点符号=> (?![\W_]{2})
  • 检查每个位置的负向前瞻=> (?:(?!...)[\w.]){3,25}
    (使用非捕获群组(?:)代替(),因为我们不需要保存群组)
  • 至少2个字母=> (?:.*[a-z]){2}假设i标志
  • 包装为前瞻(不消耗任何字符),因此我们可以检查多个条件=> (?=(?:...))

最终的正则表达式字面值:

/^(?=(?:.*[a-z]){2})(?:(?!^[\W_]|[\W_]{2}|[\W_]$)[\w.]){3,25}$/i

https://regex101.com/r/yK1cB3/5#javascript

<小时/> FTR:在支持x标志的语言中(忽略正则表达式中的空格),可以使其更具可读性(参见workaround for javascript):

^
(?=
  (?:.*[a-z]){2}
)
(?:
   (?!^[\W_]|[\W_]{2}|[\W_]$)
   [\w.]
){3,25}
$

答案 2 :(得分:1)

您可以尝试:

^(?=.*[a-zA-Z].*[a-zA-Z].*)[a-zA-Z0-9](?!.*[._]{2,}|.*[._]$)[._a-zA-Z0-9]{2,24}$

或者,如果您更喜欢使用 \ w \ d \ s 这样的字符类,可以使用:

^(?=.*[a-zA-Z].*[a-zA-Z].*)\w(?!.*[._]{2,}|.*[._]$)(\w|[._]){2,24}$
  

http://regexr.com/3ct34

答案 3 :(得分:1)

羚牛部分在你的谜语挑战。这是我的版本。也会有不错的表现:)

/^(?=(?:.*?[a-z]){2})[a-z\d](?!.*?[._]{2})[\w.]{1,23}[a-z\d]$/i

i flag用于无效匹配,其中[a-z]与alpha [a-zA-Z]等效。
对于字词\w[A-Za-z0-9_]short,因此[\w.]将匹配允许的字符。
(?:打开non capturing group主要用于重复或替换(如果不需要群组) (?= (?! lookarounds是在某个位置触发的零长度断言。

  • 规则2:在[a-z\d]开始时需要一个alnum ^,在$结束时需要一个alnum [\w.]{1,23}
  • 规则1&amp; 5:不少于3,不超过25,开始/结束减去(?!.*?[._]{2})
  • 规则3:(?=(?:.*?[a-z]){2})没有通过否定前瞻检查连续标点符号。
  • 规则4:import UIKit import Alamofire import SwiftyJSON class MenuView: UIViewController, KYDrawerControllerDelegate,UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var menuTableview: UITableView! struct Objects { var sectionName : String! var sectionObjects : [String]! } var objectsArray = [Objects]() var categoriesArr = [String]() override func viewDidLoad() { super.viewDidLoad() let bar:UINavigationBar! = self.navigationController?.navigationBar //self.title = "Home Screen" bar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default) bar.shadowImage = UIImage() bar.alpha = 0.0 objectsArray = [ Objects(sectionName: "", sectionObjects: ["Home"]), Objects(sectionName: "Categories", sectionObjects: categoriesArr), Objects(sectionName: "My Account", sectionObjects: ["My WishList", "My Profile", "My Addresses", "My Order", "Log out"]), Objects(sectionName: "Support", sectionObjects: ["About Us", "Delivery Information", "Privacy Policy", "Terms & Conditions", "Contact Us", "Return Policy"])] } override func viewWillAppear(animated: Bool) { super.viewWillAppear(true) callAPI() } //MARK: UITabView DataSources func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell! cell.textLabel?.text = objectsArray[indexPath.section].sectionObjects[indexPath.row] return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return objectsArray[section].sectionObjects.count } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return objectsArray.count } func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return objectsArray[section].sectionName } func callAPI () { //SwiftSpinner.show("Sending request..") Alamofire.request(.POST, "http://www.picknget.com/webservice/index.php/Home/get_all_category") .responseJSON { response in if let value = response.result.value { let json = JSON(value) if let _statusCode = json["status"].string { print("the ststus code is ", _statusCode) if (_statusCode == "1"){ self.parseJSON(json) } else { self.callAlert("Alert", _msg: "Something Went Wrong Kindly Check Your Connection & Try Agian") } } //print ("json result ", json) } }.responseString { response in //print("response ",response.result.value) } } func parseJSON(json: JSON) { for result in json["category"].arrayValue { print("The available categories are",result["MainCatName"].stringValue) self.categoriesArr.append(result["MainCatName"].stringValue) } print("@@@@@@@@") objectsArray[2].sectionObjects = categoriesArr print(categoriesArr.count) print(categoriesArr[0],categoriesArr[1]) dispatch_async(dispatch_get_main_queue(),{ self.menuTableview.reloadData() }); } 至少检查2个字母并带有正面预测。

Check out demo at regex101