【问题标题】:Regex for alphanumeric with only one space or one hypen仅包含一个空格或一个连字符的字母数字的正则表达式
【发布时间】:2015-11-19 05:54:04
【问题描述】:

我需要一个正则表达式,它需要满足以下条件:-

  1. 它应该接受字母数字
  2. 只有一个spacehyphen 或者两者都可以。但无论如何它应该只有一个space 或一个hyphen
  3. 最大总长度应为 10 个字符

例如有效数据

  • W1A 1HQ
  • 1234-456
  • IT-12345
  • 12345

到目前为止,我已尝试使用以下表达式,但它无法正常工作

(^[a-zA-Z0-9][^\s\-].*[^\s\-][a-zA-Z0-9]){0,8}

我需要在这里修改什么吗?

编辑
此处发布的解决方案不接受字符串中一个空格和一个连字符的组合。 请提供一个能同时支持所有要求的表达式。

【问题讨论】:

  • 是的,你知道。根据您当前的 RegExp,A1.B2.C3.D4.E5 有效。
  • (?=.*{0,10})[a-z0-9]+(?:[-\s][a-z0-9]+)?
  • @AnirbanSenChowdhary 发布“此处发布的解决方案不接受...”是轻描淡写的,特别是对于拥有 2k+ 代表的人。你不认为你应该提供一个测试用例以及你正在使用的代码吗?我相信您目前的代码有问题,而不是正则表达式。

标签: javascript jquery regex regular-language


【解决方案1】:

你可以使用正则表达式/^(?=.{0,10}$)[a-z0-9]+(?:[\s-][a-z0-9]+)?$/i

演示:

$('#input').on('input', function() {
  $('#res').text(this.value.match(/^(?=.{0,10}$)[a-z0-9]+(?:[\s-][a-z0-9]+)?$/i) ? 'Valid' : 'Not Valid')
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="input">
<div id="res"></div>

Explanation here

^(?=.{0,10}$)[a-z0-9]+(?:[\s-][a-z0-9]+)?$


更新:

只有一个空格或连字符或两者都可以有

/^(?=.{0,10}$)[a-z0-9]+(?:([\s-])[a-z0-9]*(?:(?!\1)[\s-])?[a-z0-9]+)?$/i

$('#input').on('input', function() {
  $('#res').text(this.value.match(/^(?=.{0,10}$)[a-z0-9]+(?:([\s-])[a-z0-9]*(?:(?!\1)[\s-])?[a-z0-9]+)?$/i) ? 'Valid' : 'Not Valid')
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="input">
<div id="res"></div>
^(?=.{0,10}$)[a-z0-9]+(?:([\s-])[a-z0-9]*(?:(?!\1)[\s-])?[a-z0-9]+)?$

【讨论】:

  • 您自己绘制图表,还是有一些网站可以自动完成?对于仍在为正则表达式苦苦挣扎的我们来说,这真的是很棒的视觉帮助:D
  • @AnirbanSenChowdhary:你能详细说明你的问题吗
  • @AnirbanSenChowdhary:在这种情况下会出现问题
【解决方案2】:

这个表达式也验证:

只有一个spacehyphen两者都可以

并允许在字符串的开头或结尾处使用连字符/空格。

正则表达式

/^(?!(?:[^-]*-){2}|(?:[^ ]* ){2})[- a-z0-9]{0,10}$/i

regex101 demo

匹配:

  • ^ 字符串开始
  • (?!(?:[^-]*-){2}|(?:[^ ]* ){2}) 后面没有:(negative lookahead)
    • (?:[^-]*-){2}) 2 个连字符,或
    • (?:[^ ]* ){2} 2 个空格
  • [- a-z0-9]{0,10} 字母数字、连字符或空格,最大长度为 10
  • $字符串结束
  • 模式/i:不区分大小写匹配

代码

str = "-ABC 123";
re = /^(?!(?:[^-]*-){2}|(?:[^ ]* ){2})[- a-z0-9]{0,10}$/i;

if (str.match(re)) {
  document.body.innerText += "VALID";
} else {
  document.body.innerText += "Invalid string";
}
  

【讨论】:

  • 此处发布的解决方案不接受字符串中一个空格和一个连字符的组合。请提供一个能同时支持所有要求的表达式。
  • @AnirbanSenChowdhary 匹配 str -ing。事实上,代码sn-p中的例子实际上有1个连字符和1个空格。你能提供一个失败的例子吗?
【解决方案3】:
// Parameter: String which has to be checked with a
//   regular Expression.

function checkString(toCheck) {

  if (toCheck.length <= 10) {
    var reg = /^[a-zA-Z0-9]+(\s|-|\s-|-\s)?[a-zA-Z0-9]+$/;

    if (reg.test(toCheck)) {
      return true;
    } 
  } 

 return false;
}

codepen 上的完整示例: http://codepen.io/mizech/pen/EVMRJG

【讨论】:

  • 此处发布的解决方案不接受字符串中一个空格和一个连字符的组合。请提供一个能同时支持所有要求的表达式。
  • ( ... \s-|-\s ...) => 表示:空格后接连字符或连字符后接空格。这有什么问题?
  • 请查看 codepen 示例:codepen.io/mizech/pen/EVMRJG - 我添加了两个附加值“123 -abc”、“123-abc”。你会看到它有效。
【解决方案4】:

试试这个:

^(?=.{1,10}$)([a-zA-Z0-9]+\s{0,1}[a-zA-Z0-9]*\-{0,1}[a-zA-Z0-9]+)$

这里有详细的解释:https://regex101.com/r/hV3rJ2/1

【讨论】:

  • 对你的答案做更多解释。
  • 此处发布的解决方案不接受字符串中一个空格和一个连字符的组合。请提供一个能同时支持所有要求的表达式。
猜你喜欢
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多