Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式:字符串之间不匹配“无字符”_Regex - Fatal编程技术网

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

Regex 正则表达式:字符串之间不匹配“无字符”,regex,Regex,如果有空格,我必须在第一个空格之前验证字符串是否匹配以下格式: 最多3个前导字母 至少4个连续数字 最多3个尾随字母 举例来说,以下是有效的: 1234 Abc123456DeF 1234废话+ XyZ01234 但是,我很难避免这种情况:123a+b等等 到目前为止,我有^\w{0,3}\d{4}\w{0,3}\s*但是问题在于确保在第一节中没有捕获非字母 我可以看到一些解决方案: 运行regex两次,首先将字符串设置为第一个空格[^\s]+,然后再次将regex应用于该空格,确保它以3个字母

如果有空格,我必须在第一个空格之前验证字符串是否匹配以下格式:

最多3个前导字母 至少4个连续数字 最多3个尾随字母 举例来说,以下是有效的:

1234 Abc123456DeF 1234废话+ XyZ01234 但是,我很难避免这种情况:123a+b等等

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

我可以看到一些解决方案:

运行regex两次,首先将字符串设置为第一个空格[^\s]+,然后再次将regex应用于该空格,确保它以3个字母^\w{0,3}\d{4}\w{0,3}$结尾。这就是我现在所做的,但肯定有一种方法可以用一个表达式来表达——我就是不知道怎么做

确保潜在的3个尾随字母和潜在的空白之间不存在非字母^\w{0,3}\d{4}\w{0,3}没有非字母\s* 我试过消极前瞻?!。*但这似乎没有任何作用

此正则表达式满足您的规范

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

说明: 根据您的规格

\w{0,3}?最多3个前导字母

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

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

如果有空格,我必须在第一个空格之前验证字符串是否匹配以下格式:

\s?因此有一个可选的空间

注意:-我保留这一点,因为在评论中指出了许多缺点。所以要保持评论的上下文

解决方案:

就像我在书中说的

@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**$

说明:

?=.[0-9]{4,}[A-Za-z]{0,3}?:\s |$此正向前瞻确保规范定义的第一部分匹配。它查找所提到的规范以及\s或$i.e字符串的结尾。因此与第一部分相匹配

[A-Za-z]{0,3}[0-9]{4,}[A-Za-z]{0,3}\s*?:\s*\s**正则表达式的其余部分符合规范要求

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

\w与[A-Za-z0-9_]相同,因此为了只匹配字母,应该使用[A-Za-z]


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

+是特殊符号。当你说字母时,它应该被计算在内吗?还不清楚到什么时候。至少应该是,或者最多是\w字符类中没有+。1234 blah+如何符合规范?@Rahul当我说字母时,我指的是字符a-z/a-z,所以不是+。到目前为止,最多是基本上相同的事情,我不理解那里的混乱\w没有+事实上,我之所以选择它是因为它与a-z/a-z包含相同的基数。非字母字符可以包含在第一个空格之后,因此我提到在第一个空格之前需要遵循格式whitespace@JCK:您提到了在找到空白之前要应用的三个规范。在1234 blah+中,这些规范是如何满足的?@JCK:好的,那么你的意思是在遇到第一个空格之后,可能会有任意数量的字符?是的,我的意思是:在第一个空格之后,任何东西都会出现,在那之前就是规范matter@JCK:最后一点。在第一个空格之后会有更多的空格吗?类似aaa1234sss dddd fff gggg的东西?它捕获了以下情况,但它不应该捕获:1234+,1234abcdefg。编辑是可以有1个以上的空白\w并不总是与[A-Za-z0-9_]相同,在Python 3和.NET中默认情况下它等于[\p{L}\p{N}{u]。我现在看到\w并不一定意味着只有[0-9a-Za-Z],所以我认为[A-Za-Z]正是我需要的。这似乎很好地解决了问题,让我感到困惑的是我的头围绕着?:$\s+部分。谢谢@JCK:我不明白它是如何解决的,当它明显失败时,您不需要一个加号后\s。它实际上几乎和我的正则表达式一样。