正则表达式:匹配字符串之间的“无字符”

时间:2017-05-15 03:13:46

标签: regex

我必须在第一个空格(如果有的话)之前验证字符串是否符合以下格式:

  • 最多3个主要字母
  • 至少连续4位数字
  • 最多3个尾随字母

举例说明,以下内容有效:

  • 1234
  • Abc123456DeF
  • 1234 blah+
  • XyZ01234

我无法避免这种情况:123a+b blah

到目前为止,我有(^\w{0,3}\d{4}\w{0,3})\s*,但问题在于确保第一部分没有捕获到非字母。

我可以看到几个解决方案:

  • 运行正则表达式两次,首先将字符串添加到第一个空格([^\s]+),然后再次应用正则表达式,确保它最多以3个字母(^\w{0,3}\d{4}\w{0,3}$)结尾。这就是我现在所做的,但肯定有一种方法可以在一个表达式中做到这一点 - 我无法弄清楚如何

  • 确保(潜在)3个尾随字母和(潜在)空格之间不存在非字母。 (^\w{0,3}\d{4}\w{0,3}no non-letters)\s* 我尝试过负面预测(?!.*),但这似乎没有做任何事情。

2 个答案:

答案 0 :(得分:1)

此正则表达式符合您的规格。

正则表达式: ^\w{0,3}\d{4,}\w{0,3}\s?$

<强>说明: 根据您的规格。

\w{0,3}?最多3个主要字母

\d{4,}至少4个连续数字

\w{0,3}?最多3个尾随字母

  

我必须在第一个空格(如果有的话)之前验证字符串是否符合以下格式:

\s?因此是一个可选空格.

Regex101 Demo

注意: - 我保持这一点,因为评论中指出了许多缺点。所以要保持评论的背景。

<强>解决方案:

就像我在comment中所说的那样。

  

@JCK:问题是。 。即使是空白也是可选的。因此难以区分第一和第二部分。

现在采用先行解决了这个问题。完整的正则表达式是这样的。

正则表达式: ^(?=.*[0-9]{4,}[A-Za-z]{0,3}(?:\s|$))[A-Za-z]{0,3}[0-9]{4,}[A-Za-z]{0,3}\s*?(?:\S*\s*)*$

说明:

  1. (?=.*[0-9]{4,}[A-Za-z]{0,3}(?:\s|$))这个积极的前瞻确保您的规范定义的第一部分是匹配的。它查找提到的规范以及\s$,即字符串的结尾。因此匹配第一部分。

  2. [A-Za-z]{0,3}[0-9]{4,}[A-Za-z]{0,3}\s*?(?:\S*\s*)*其余的正则表达式符合规范。

  3. Check by entering strings one by one.

答案 1 :(得分:0)

正则表达式: (^[A-Za-z]{0,3}\d{4,}[A-Za-z]{0,3})(?:$|\s+)

\w[A-Za-z0-9_]相同,因此要匹配字母,请使用[A-Za-z]

(?:$|\s+)匹配字符串的结尾或至少一个空格(因此忽略字符串的其余部分)。