【问题标题】:Why is this string matching my regEx?为什么这个字符串与我的正则表达式匹配?
【发布时间】:2016-12-11 08:00:20
【问题描述】:

我很抱歉又问了一个正则表达式问题,但即使在阅读了两个在线教程并使用了三个在线正则表达式测试器之后,我仍然不明白为什么我的一些测试字符串与我的正则表达式匹配。

我想实现:

  • 字符串的第一个字符只包含字母或数字
  • 以下字符包含字母、数字、减号 (-)、下划线 (_)、空格 ()、竖线 (|)
  • 整个字符串长度在 3 到 30 个字符之间

所以我写了这个正则表达式:[a-zA-Z0-9]{1}[a-zA-Z0-9_\-\| ]{2,29}

在我的理解中,这意味着字符串必须以一个字符 ({1}) 开头,该字符是字母或数字 ([a-zA-Z0-9]\w),接下来的 2 到 29 个字符 ({2,29}) 可以还包含上面提到的字符。

使用在线工具(例如 http://www.phpliveregex.com/ )和以下测试字符串测试正则表达式时,我得到以下结果

+--------+----------+--------+
| String | Expected | Actual |
+--------+----------+--------+
| T_2    | OK       | OK     |
| This   | OK       | OK     |
| -bla   | NOK      | OK     |
| _bla   | NOK      | OK     |
| 0|This | OK       | OK     |
+--------+----------+--------+

我不明白为什么字符串 -bla_bla 与正则表达式匹配,因为它们不是以数字或字母开头。

谁能给我解释一下,告诉我我的错误吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您需要在正则表达式的开头添加^ 符号,以指出它是字符串的开头:

    ^[a-zA-Z0-9]{1}[a-zA-Z0-9_\-\| ]{2,29}

    ^ 的意思是“字符串将以^ 之后的表达式开头。如果你不输入,整个表达式将匹配字符串中的任何位置(因为它没有起点)。所以,例如,bla 将在 _bla 中匹配 - 你会得到一个你不想要的匹配。

    Here is a working example

    【讨论】:

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