代码之家  ›  专栏  ›  技术社区  ›  PDStat

正则表达式与字符串中的任意位置正好匹配1

  •  1
  • PDStat  · 技术社区  · 4 年前

    所以我需要在字符串中匹配大小写a-z字母,句点(.)和@。作为一个复杂的字符串必须在字符串和中的任何位置都有@once。至少在弦的任何地方有一次。

    abcd@.  // match
    @ab.cd  // match
    a@cd@.  // no match
    abcd@  // no match
    

    我试着通过前瞻来变得聪明(显然不是很聪明),但是这个看起来很棘手。

    (?=[@]){1}[a-zA-Z@]+$
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Wiktor Stribiżew    4 年前

    这个 (?=[@]){1}[a-zA-Z@]+$ @ 然后有零个或多个字母或 @ what it matches

    你需要使用

    ^(?=[^@]*@[^@]*$)(?=[^.]*\.)[a-zA-Z@.]+$
    

    ^(?=[^@]*@[^@]*$)(?=[^.]*\.[^.]*$)[a-zA-Z@.]+$
    

    看到了吗 regex demo #1 regex demo #2 .

    细节

    • ^ -字符串开头
    • (?=[^@]*@[^@]*$) - 一根线也不能超过一根 -需要0+个字符而不是 ,以及除 @
    • (?=[^.]*\.) - 至少需要一个点 . 然后是一个 .
    • (?=[^.]*\.[^.]*$) - 只需要一个点,字符串中不能超过一个点 -需要0+个字符而不是 . ,一个 ,以及除 .
    • [a-zA-Z@.]+ -一个或多个ASCII字母, @ .
    • $ -字符串结尾。
        2
  •  1
  •   The fourth bird    4 年前

    另一种选择是使用一个lookahead断言 @ 并在两个字符类之间匹配一个点,或者反过来断言一个点并进行匹配

    ^(?=[^@]*@[^@]*$)[A-Za-z@]*\.[A-Za-z@]*$
    

    • ^ 字符串开头
    • (?=[^@]*@[^@]*$) 在字符串中只断言1@char
    • [A-Za-z@]*\.[A-Za-z@]* 在可选的重复字符类之间匹配一个点,每个字符类匹配a-Za-z中的1个字符@
    • $ 字符串结尾

    Regex demo

    为了 ,您可以允许匹配第二个字符类中的点:

    ^(?=[^@]*@[^@]*$)[A-Za-z@]*\.[A-Za-z@.]*$
    

    Regex demo

        3
  •  1
  •   JvdV    4 年前

    我想你可以用:

    ^(?=.*\.)[a-zA-Z.]*@[a-zA-Z.]*$
    

    在线查看 demo


    • ^ -开始串ancor。
    • (?=.*.) -正向向前看,最多可以看到一个文字点。
    • [a-zA-Z.]* -大写/小写字母或点中的零个或多个字符。
    • @ @
    • [a-zA-Z.]*
    • $ -结束字符串ancor。