需要正则表达式模式用于正确名称的表单字段

问题描述 投票:0回答:3

我想为字段创建一个 HTML 模式作为(显示名称)。没有更复杂的文件,只有一个包含一个字段的 HTML 文件。

要求是:

  1. 字段的起始字符只能是大写字母 以下字母应为小写,但可以是任何类型 字符(数字、特殊字符)
  2. 不能以空格开头,也不能使用连续的空格
  3. 空格后的单词可以以(字母、数字、特殊 字符)但如果它是一个字母应该是大写

我可以编写符合大多数要求的正则表达式,但不包含特殊字符。

^[A-Z][a-z]*( [A-Z][a-z]*)*$

但是我想在任何地方使用特殊字符和数字(第一个字母除外),并且问题发生在这里,这就是模式:

^[A-Z][a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^`|~]*( [A-Z][a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^`|~]*)*$

我在控制台上收到此错误:

this causing this error: Unable to check <input pattern=‘^[A-Z][a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^|~]*( [A-Z][a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^|~]*)*$’> because ‘/^[A-Z][a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^|~]*( [A-Z][a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^|~]*)*$/v’ is not a valid regexp: invalid character in class in regular expression

我尝试了很多其他的事情,但是使用特殊字符对我来说是一个麻烦。您能告诉我正确的模式是什么吗?

谢谢。

这是整个代码:

const registrationForm = document.querySelector('#registration-form');

registrationForm.onsubmit = e =>
  {
  e.preventDefault();  // 4 testing mode
  console.clear();
  console.log( ':) name  accepted ', registrationForm.display_name.value);
  }
<form id="registration-form">
  <!-- Display Name Field -->
  <label for="display-name">Display Name:</label>
  <input type="text" id="display-name" name="display_name" pattern="^[A-Z][a-z0-9@()[\]{}._\-!#$%&'*+/=?^`|~]*(( [A-Z][a-z0-9@()[\]{}._\-!#$%&'*+/=?^`|~]*)| (?! )[a-zA-Z0-9@()[\]{}._\-!#$%&'*+/=?^`|~]*)*$" title="Display name must start with a letter, have no consecutive spaces, and each word must start with an uppercase letter. Length must be between 2 and 50 characters."
    minlength="2" maxlength="50" required>
  <br><br>

  <button type="submit">Submit</button>
</form>

html regex forms regression
3个回答
0
投票

问题在于正则表达式中转义和定义特殊字符的方式。具体来说,字符集中的 ] 字符(括在方括号 [] 中)必须正确转义,因为它是表示字符集结尾的元字符。

这是更正后的正则表达式:

^[A-Z][a-z0-9@()[\]{}._\-!#$%&'*+/=?^`|~]*( [A-Z][a-z0-9@()[\]{}._\-!#$%&'*+/=?^`|~]*)*$

0
投票

尝试:

^[A-Z](?:[a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^`|~]|\s[A-Z0-9@()\[\]{}._\-!#$%&'*+\/=?^`|~])*$

参见:regex101


说明

  • ^...$
    :锚定以确保整个字段匹配
  • [A-Z]
    :第一个大写字母
  • (?: ... )*
    :然后重复
    • [a-z0-9@()\[\]{}._\-!#$%&'*+\/=?^`|~]
      :小写或特殊字符
    • |
      :或
    • \s[A-Z0-9@()\[\]{}._\-!#$%&'*+\/=?^`|~]
      :空格后跟大写或特殊字符

0
投票

不清楚你所说的“特殊字符”是什么意思。 我选择将其定义为任何非以下内容:大写或小写字母、数字或空格。

^\p{Lu}[^\p{Lu}\p{Z}]*(?:\p{Z}[^\p{Ll}\p{Z}][^\p{Lu}\p{Z}]*)*$

只需编辑

[
...
]
之间的位即可更改定义以排除更多。

有关 unicode 字符类别的信息,请参阅: https://www.unicode.org/versions/Unicode16.0.0/core-spec/chapter-4/#G124142

© www.soinside.com 2019 - 2024. All rights reserved.