【问题标题】:How to write a regular expression to validate a 4 character string as a non-zero binary number?如何编写正则表达式以将 4 个字符的字符串验证为非零二进制数?
【发布时间】:2014-12-23 02:24:50
【问题描述】:

我有一个字符串,例如 1001,它需要正好是 4 个字符,可以是 01 的任意组合,但不能全为零(全是可以的)。

我想到了:

^[01]{4}$

不起作用,因为它接受0000

我将使用 PHP 或 JavaScript 来执行此操作。

只是添加一个细节。

我将在多选问卷进入数据库之前使用它来验证答案,因此字符串的长度为 N,具体取决于问题的选项数。

所以提供通用解决方案的功能会很棒。

【问题讨论】:

  • 为什么不把正则表达式和 && val > 0 一起测试?
  • 一路走下去——把二进制数解析成整数,然后检查它是否大于0。
  • 同意,我有一些 40 个字符长的字符串,带有 0 和 1,所以我猜 regxexp 不会单独删除它。
  • 那么您的实际问题是关于只有 4 个字符长的二进制字符串,还是关于长度为 N 个字符的二进制字符串?
  • N 个字符的长度,我用它来验证多选问卷的答案,然后再进入数据库。

标签: javascript php regex


【解决方案1】:

它应该可以工作

^(?!0000)[01]{4}$

DEMO

注意:使用gm作为修饰符

阅读更多关于 Lookahead and Lookbehind Zero-Length Assertions 的信息,它实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。

模式说明:

  ^                        the beginning of the string
  (?!                      look ahead to see if there is not:
    0000                     '0000'
  )                        end of look-ahead
  [01]{4}                  any character of: '0', '1' (4 times)
  $                        end of the string

【讨论】:

  • @Bohemian 正则表达式 ^(?!0000){1}[01]{4}$ 在功能上是否相同,还是我遗漏了一些区别?
  • @shree.pat18 在regex101.com 测试它。它不适用于 PHP 或 javascript
  • @shree.pat18 根据您的模式,它应该是^(?:(?!0000)){1}[01]{4}$
  • @Bohemian,在这种情况下说“终于”是不合理的。直到问题发布一个小时后,才进行了编辑以声明语言将是 PHP 或 JavaScript。如果没有这些信息,假设正则表达式可以使用否定前瞻,那么答案就会对问题可能涉及的语言施加限制。
  • @Braj 我发布的链接实际上表明我的答案是使用 JS。不过,看到这里有更好的答案,我删除了我的。
【解决方案2】:

另一个简单的解决方案是这样的:

^[01]{4}(?<=100|10|1)$

根据您的两个可能值 [0,1],您只有 8 种不同的可能性:

0000 0001 0010 0011 0100 0101 0110 0111 1111

您原来的正则表达式会命中所有这些值。但是,正向后视代码可确保代码以“1”、“10”或“100”结尾。这涵盖了除 0000 之外的所有可能值。

【讨论】:

  • 您确定 javascript 或 php 接受可变长度后视吗?
【解决方案3】:

正则表达式:

^(1[01]{3}|01[01]{2}|001[01]|0001)$

将起作用并且不依赖于前瞻或后瞻操作,这些操作不一定在所有正则表达式实现中都可用。虽然,现在问题已被编辑以提供将使用的语言:PHPJavaScript 正则表达式都否定了前瞻。在这些语言中,正则表达式 ^(?!0000)[01]{4}$ 将起作用。

此答案顶部的正则表达式使用多个术语来构建连续更明确的匹配,因为每个字符位置都被指定。关键是匹配的四个字符串中必须至少有一个1 字符。一旦在字符串中遇到1 字符,我们就不关心剩下的字符是什么,除了[01]

第一个词 1[01]{3} 将匹配以 1 开头的任意四个 01 数字。这涵盖了所有需要的匹配字符串,其中第一个数字是1,只留下尚未定义为匹配的以0 开头的所需字符串。

第二个词01[01]{2} 将匹配以01 开头的任意四个01 数字。这只会留下以 00 开头的所需字符串,但尚未定义为匹配。

第三个词 001[01]{2} 将匹配 00100011

第四个词 0001 匹配一个与其他词不匹配的所需字符串。

验证一个 N 字符长的非零二进制字符串:

使用正则表达式比较和长度检查:
您的 cmets 表明您有更长的(例如 40 个字符)类似的字符串,您需要在其他情况下匹配这些字符串。

鉴于您需要检查各种不同长度的字符串,您最好创建一个能够测试多个不同长度的函数。

在 JavaScript 中,一种可能性是:

function isNonZeroBinaryStringOfLengthN(str, len) {
    //True if string is all 0 or 1 with at least one 1 and is the right length.
    return (str.length == len && /^[01]*1[01]*$/.test(str) );
}

使用内置函数将字符串解析为整数并不是一个好主意:
对于这种情况,您最好还是坚持使用基于正则表达式的解决方案,而不是使用 PHP intval($str,2) 或 JavaScript parseInt(str,2)。原因是这两个函数都没有正确验证字符串。

在 PHP 中的命令:

echo intval('011134011',2);

打印

7

在 JavaScript 中的命令:

console.log(parseInt("0101382730101",2));

打印:

5

这意味着如果您使用其中一个内部字符串->int 解析函数,您仍然必须单独验证您传递给任一函数的字符串以匹配^[01]{n}$。鉴于无论如何您都必须这样做,您最好使用上面提到的单个正则表达式和长度测试而不将字符串解析为 int。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多