用于登录的Regexp

用于登录的Regexp,regex,Regex,我有一个字符串必须以字母开头,由字母、数字、句点和减号组成,但只能以字母或数字结尾;最小长度为-1个字符,最大长度为-20。在这里,我编写了必须忽略last的测试行: abcAA123.-as a aa aA a1 a1a a.a a-s ad.a1 ads.a a-12 A-j A.b A.....-bg v--.1.2.3.a.s..d.fg45.--.. 我的正则表达式是\w?(\w| \.\124; \-)+?\ w+及其匹配的最后一个字符串,不匹配a。我的错在哪里?如何编写正确的正则

我有一个字符串必须以字母开头,由字母、数字、句点和减号组成,但只能以字母或数字结尾;最小长度为-1个字符,最大长度为-20。在这里,我编写了必须忽略last的测试行:

abcAA123.-as
a
aa
aA
a1
a1a
a.a
a-s
ad.a1
ads.a
a-12
A-j
A.b
A.....-bg
v--.1.2.3.a.s..d.fg45.--..

我的正则表达式是
\w?(\w| \.\124; \-)+?\ w+
及其匹配的最后一个字符串,不匹配
a
。我的错在哪里?如何编写正确的正则表达式?

您需要使用lookarounds

^(?=.*[A-Za-z0-9]$)[A-Za-z][A-Za-z\d.-]{0,19}$

  • (?=.[A-Za-z0-9]$)
    断言匹配必须以字母或数字结尾
  • [A-Za-z]
    必须以字母开头
  • [A-Za-z\d.-]{0,19}
    根据char类中存在的模式匹配char。并且匹配的字符数必须介于0到19之间

您需要使用周围环境

^(?=.*[A-Za-z0-9]$)[A-Za-z][A-Za-z\d.-]{0,19}$

  • (?=.[A-Za-z0-9]$)
    断言匹配必须以字母或数字结尾
  • [A-Za-z]
    必须以字母开头
  • [A-Za-z\d.-]{0,19}
    根据char类中存在的模式匹配char。并且匹配的字符数必须介于0到19之间

您的正则表达式只匹配至少包含2个字符的字符串。部分
(\w| \.\124; \-)+?
中的
使量词变懒,这意味着它匹配的字符尽可能少,但
+
量词至少匹配一个字符。如果希望该零件至少不匹配任何零件,则应将
+
替换为
*

编辑:
我注意到我的回答充其量是不完整的。我提出的正则表达式看起来像这样
^[a-zA-Z](?=[\w\.\-]*?\w$)|^[a-zA-Z]$
。这一个匹配每个字符串的第一个字母,该字符串以字母开头,以字母或数字结尾。
^[a-zA-Z](?=[\w\.\-]*?\w$)
,或者只包含一个字母。
^[a-zA-Z]$

您的正则表达式只匹配至少包含2个字符的字符串。部分
(\w| \.\124; \-)+?
中的
使量词变懒,这意味着它匹配的字符尽可能少,但
+
量词至少匹配一个字符。如果希望该零件至少不匹配任何零件,则应将
+
替换为
*

^[\w.-]{0,19}[0-9a-zA-Z]$
编辑: 我注意到我的回答充其量是不完整的。我提出的正则表达式看起来像这样
^[a-zA-Z](?=[\w\.\-]*?\w$)|^[a-zA-Z]$
。这一个匹配每个字符串的第一个字母,该字符串以字母开头,以字母或数字结尾。
^[a-zA-Z](?=[\w\.\-]*?\w$)
,或者只包含一个字母。
^[a-zA-Z]$

^[\w.-]{0,19}[0-9a-zA-Z]$
只要使用这个,你就可以很好地使用了。你的currect正则表达式不工作,因为它至少有2个字符。请参阅演示

只要使用这个,你就可以很好地使用了。你的currect正则表达式不工作,因为它至少有2个字符。请参阅演示

实际的regexp是

[a-z]?(.|\-)+(\w+|\b)
它与
a
不匹配,因为它后面紧接着一个单词结尾字符。它与
\b

实际的regexp是

[a-z]?(.|\-)+(\w+|\b)
它与
a
不匹配,因为它后面紧接着一个单词结尾字符。它与
\b


您使用的是什么语言?
字符串必须以字母开头,
,但只能以字母或数字结尾。我想您不想匹配具有一位数的字符串。@hwnd我使用的是C++您使用的是什么语言?
字符串必须以字母开头,
,但只能以字母或数字结尾。我想您不想匹配具有一位数的字符串。@hwnd我使用的是C++您是对的。我只是读到了他连一个字母“a”都配不上的程度。我会修改我的答案,你说得对。我只是读到了他连一个字母“a”都配不上的程度。我将编辑我的答案。