正则表达式与简单情况不匹配

时间:2020-08-29 03:24:57

标签: java regex

我目前拥有的... ^((([A-Za-z])+([A-Za-z0-9\-])*([a-zA-Z0-9])+)*\.)+$

规则:

  1. 第一个字符必须为“。”或[a-zA-Z](如果字符串的长度为1,则只能为“。”)
  2. 它必须以“。”结尾。
  3. 在任何“。”之前。只能有[a-zA-Z0-9]
  4. a-zA-Z0-9和除外。可能会有-(连字符),这是唯一的其他字符集值
  5. 在任何“。”之后。不能有“-”

应匹配的示例: . a. a-9. abc. abc.a-c.abc.

不应该匹配的: -. -a. a-. a abc.-bc ab-.abc abc.a-@c ..

当前不匹配a.,这是最简单的情况之一。您对如何解决有什么建议?

3 个答案:

答案 0 :(得分:1)

/^(?!\-)([A-Z0-9]|[\-\.](?!\.))*\.$/i

这还将处理..--的情况。
试试看。

Live demo on Regex101

让我们分解一下:

/
^              Line start
(?!\-)         Must not start with -
(              Start of matching group
  [A-Z0-9]     Match list
  |            OR
  [-.](?![-.]) A - or . not followed by - or .
)*             End group matching 0 or more times
\.             Must end in . 
$              Line end
/i             Treat as case insensitive

答案 1 :(得分:1)

作为没有环顾四周的替代解决方案,您可以通过匹配a-zA-Z来开始字符串。

然后使用一个可选的模式,该模式匹配零个或多个包含连字符的字符类重复,并以不带连字符的匹配结尾,以防止它出现在重复中的点之前或字符串的末尾。 / p>

启用不区分大小写的功能:

^(?:[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9-]*[a-z0-9])*)?\.$

部分

  • ^字符串的开头
  • (?:非捕获组
    • [a-z]匹配单个字符a-z
    • (?:非捕获组
      • [a-z0-9-]*匹配0-次a-z0-9-
      • [a-z0-9]以a-z-9结尾,因此在-之前不能有.
    • )?关闭组并将其设置为可选
    • (?:非捕获组
      • \.[a-z0-9-]*匹配.和0+次a-z0-9-
      • [a-z0-9]以a-z-9结尾,因此在-之前不能有.
    • )*关闭组并重复0次以上
  • )?关闭组并使其可选以也允许单个点
  • \.匹配单个点
  • $字符串结尾

Regex demo

答案 2 :(得分:-1)

从左到右:

^-直播开始,到目前为止一切顺利

(([A-Za-z])+([A-Za-z0-9\-])*([a-zA-Z0-9])+)*-换句话说,尝试尽可能多地匹配([A-Za-z])+([A-Za-z0-9\-])*([a-zA-Z0-9])+; 0也可以。

让我们尝试一次匹配它:

([A-Za-z])+-好的,它将与a相匹配。

([A-Za-z0-9\-])*-没有匹配项。

([a-zA-Z0-9])+-此处匹配失败。这与.

不匹配

因此,它甚至一次都不匹配,我们在那个大点之后紧跟着*,然后前进:

\.-不匹配;我们在a上。