将字符串匹配要求转换为正则表达式

时间:2009-07-08 18:55:26

标签: javascript regex

我在编写正则表达式时遇到问题。我怎么写以下内容:

  1. 从可选的访问级别(1到5的数字)开始
  2. 后跟空格
  3. 然后是一个由3到5个小写字母组成的用户名
  4. 后跟3到5位数字
  5. 然后是一个或多个空格
  6. 然后是四位数的密码
  7. 然后是一个或多个空格
  8. 和相同的针再次确认..
  9. 如果信息有效,则显示提示“谢谢”。否则“输入的信息不正确。”

    我写了以下内容,但它无法正常工作:

    reg=/^(\d{1,5})?/s ([a-z]{3,5}\b\d{3,5}\s) \s\1 $/;
    

    我将不胜感激。

8 个答案:

答案 0 :(得分:4)

好的,按照你的指示写信(我不相信你真正想要的)你可以使用:

/^[1-5]?\s[a-z]{3,5}\d{3,5}\s+(\d{4})\s+(\1)$/

打破这个:

  • 行首
  • 1到5之间的单个数字,可选
  • 空格(严格来说,任何空格)
  • 3到5个小写字母
  • 3到5位数
  • 至少一个空间
  • 正好4位数
  • 至少一个空间
  • 4位数的相同模式(\ 1在这里至关重要)
  • 行尾

    您为访问级别引入了错误的模式,一个随机的分词符号,无法正确捕获多个空格,这是您的模式崩溃的地方。

答案 1 :(得分:4)

^(?:[1-5] )?[a-z]{3,5}[0-9]{3,5} +([0-9]{4}) +\1$

<强>解释

    ^            Anchor start of line.
    (?:[1-5] )?  Optional access level 1 to 5 followed by a single space,
                 the group is non-capturing.
    [a-z]{3,5}   User name with 3 to 5 lower case letters followed by
    [0-9]{3,5}   3 to 5 digits.
    _+           At least one space.
    ([0-9]{4})   A 4 digit pin number captured into group \1. Without the
                 non-capturing group from above the pin number would be
                 captured into group \2.
    _+           At least one space.
    \1           A backreference to the pin number captured in group \1.
    $            Anchor end of line.

答案 2 :(得分:2)

我马上就看到了一些问题:

\d{1,5}将匹配任何数字(0-9)1到5次。即0001,12,3,41332。我认为你正在寻找[1-5],它将匹配1-5的范围内的一位数。

/s应为\s

[a-z]{3,5}\b\d{3,5}\s我不确定你为什么会\b

我认为首先解决这些问题。 :)

答案 3 :(得分:0)

试试这个:([1-5])?\s[a-z]{3,5}(\s*\d{4}){2}

答案 4 :(得分:0)

听起来你想要第一个空格,即使没有指定访问级别?如果是这样,我认为应该这样做:

/^([1-5])? [a-z]{3,5}\d{3,5} +(\d{4}) +\2$/

如果空格是可选的,只需将其移到第一组括号中即可。

要显示警报,应该使用简单的if / else。

答案 5 :(得分:0)

试试这个:

^(?:[1-5] )?[a-z]{3,5}\d{3,5} +(\d{4}) +\1$

您可能会发现my regex tool对于测试正则表达式非常有用。它有一个“解释”模式,可以打破表达并描述它的作用,如果你被卡住了。

祝你好运!

答案 6 :(得分:0)

这是一个Python答案,展示了re.VERBOSE工具,如果你想明天回来并了解你的正则表达式正在做什么,这非常方便。

有关详细说明,请参阅this。你不需要藤蔓或绳索来摆动。 : - )

import re
match_logon = re.compile(r"""
    [1-5]?      # 1. start with an optional access level (a digit from 1 to 5)
    [ ]         # 2. followed by a space
    [a-z]{3,5}  # 3. then a user name consisting of between 3 and 5 small letters
    \d{3,5}     # 4. followed by between 3 and 5 digits
    [ ]+        # 5. then one or more spaces
    (\d{4,4})   # 6. and then a four digit pin number (captured for comparison)
    [ ]+        # 7. then one or more spaces
    \1          # 8. and the same pin again for confirmation..
    $           # match end of string
    """, re.VERBOSE).match
tests = [
    ("1 xyz123    9876    9876", True),
    (" xyz123    9876    9876", True), # leading space? revisit requirement!
    ("0 xyz123    9876    9876", False),
    ("5 xyz123    9876    9876", False), # deliberate mistake to test the testing mechanism :-)
    ("1 xy1234    9876    9876", False),
    ("5 xyz123    9876    9875", False),
    ("1 xyz123    9876    9876\0", False),
    ]
for data, expected in tests:
    actual = bool(match_logon(data))
    print actual == expected, actual, expected, repr(data)

Results:
True True True '1 xyz123    9876    9876'
True True True ' xyz123    9876    9876'
True False False '0 xyz123    9876    9876'
False True False '5 xyz123    9876    9876'
True False False '1 xy1234    9876    9876'
True False False '5 xyz123    9876    9875'
True False False '1 xyz123    9876    9876\x00'

答案 7 :(得分:-1)

您所描述的内容不是常规语言,因此无法通过正则表达式进行解析。问题是您的要求6和8:正则表达式没有内存,因此无法检查6和8中的PIN是否相同。