如何扩展正则表达式模式以防止开头和结尾出现某些字符?

How can I extend a regex pattern to prevent certain characters in the beginning and in the end?

我正在寻找使用 HTML5 模式的 基本 电子邮件验证。 到目前为止,我有以下内容,但我正在努力遵守以下要求的规则,尤其是。规则 1 和 3。

条件:

  1. 我只需要包含包含 ** 字母 (a-zA-Z)、数字 (0-9)、下划线 (_)、点/句点 (.)、破折号 (-) 的电子邮件地址。
  2. 我只需要涵盖标准的企业电子邮件地址,例如 firstname.lastname@domain.com、firstname.lastname@domain.co.uk、firstname.lastname@domain.de, 名字-secondname.lastname@domainPart1-domainPart2.de.
  3. 无需覆盖亚洲或阿拉伯字符,也无需覆盖此处未列出的字符。
  4. 无需覆盖不包含点/句点的电子邮件。

要求的规则:

  1. 第一个字符不能是下划线、点/句点或破折号。
  2. 最后一个字符不能是下划线、点/句点或破折号。
  3. 不能连续包含两个点/句点。
  4. 不能包含空格(也不能作为第一个或最后一个字符)。

我的方法(无效):

<input type="email" id="email" minlength="10" pattern="^(?!^\.\_\-)(?!.*[-_.]$)[a-zA-Z0-9\.\_\-]+$" required autocomplete="off">

谁能告诉我如何正确地做到这一点,并提供对单个部分的解释?

非常感谢,
蒂姆

你可以使用这个:

pattern="^\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.[a-zA-Z]{2,})+$"

解释:

  • ^ - 开始时锚定
  • \w+ - 1+ 个单词字符 (a-z, A-Z, _)
  • (?:[.-]\w+)* - 可选 (0+) 非捕获组:点或破折号,后跟 1+ 个单词字符
  • @ - 文字 @
  • \w+ - 1+ 个单词字符
  • (?:[.-]\w+)* - 可选 (0+) 非捕获组:点或破折号,后跟 1+ 个单词字符
  • (?:\.+[a-zA-Z]{2,})+ - 必需的 (1+) 非捕获组:点,后跟 2+ 个字母字符(对于 TLD)
  • $ - 锚点在末尾

请考虑在 @ 符号之前支持 +label 序列。许多人使用它来对电子邮件进行分桶:

pattern="^\w+(?:[.-]\w+)*(?:\+[\w.-])?@\w+(?:[.-]\w+)*(?:\.+[a-zA-Z]{2,})+$"

这是一个工作示例。在HTML5中不需要jQuery代码,这里添加是因为代码片段似乎不支持它。如果电子邮件无效,jQuery 代码会添加一个红色边框。在 HTML5 环境中,如果电子邮件无效,则输入文本为红色。

$('#email').on('input', function(e) {
  let pattern = $(this).attr('pattern');
  let val = $(this).val();
  let regex = new RegExp(pattern);
  if(regex.test(val)) {
    $(this).removeClass('red-border');
  } else {
    $(this).addClass('red-border');
  }
});
.red-border {
  border: 1px solid red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
Email:
    <input type="email" id="email" pattern="^\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.[a-zA-Z]{2,})+$" required autocomplete="off">