4

我需要一个正则表达式来满足以下要求:

  • 只允许使用字母、句点和空格。
  • 字符串的开头和结尾没有空格。
  • 字符串中间的空格是可以的,但不是两个连续的空格。

火柴:

"Hello world."
"Hello World. This is ok."

不匹配:

" Hello World. "
"Hello world 123." 
"Hello  world."

这在我的情况下有效

<asp:RegularExpressionValidator ID="revDescription" runat="server" 
                                ControlToValidate="taDescription" Display="Dynamic" ErrorMessage="Invalid Description." 
                                Text="&nbsp" 
                                ValidationExpression="^(?i)(?![ ])(?!.*[ ]{2})(?!.*[ ]$)[A-Z. ]{8,20}$"></asp:RegularExpressionValidator>
4

2 回答 2

2

这是 Python 中的一个解决方案,使用锚点否定前瞻断言来确保遵循空白规则:

regex = re.compile(
    """^          # Start of string
    (?![ ])       # Assert no space at the start
    (?!.*[ ]{2})  # Assert no two spaces in the middle
    (?!.*[ ]$)    # Assert no space at the end
    [A-Z. ]{8,20} # Match 8-20 ASCII letters, dots or spaces
    $             # End of string""", 
    re.IGNORECASE | re.VERBOSE)
于 2014-01-05T10:25:20.980 回答
0

我建议检查正则表达式之外的长度,否则表达式可能会变得太复杂。

这是 JavaScript 中的示例代码段:

if (str.length < 8 || str.length > 20)
  return false;
if (str.match(/(^\s|\s$|\s\s|[^A-Za-z.\s])/))
  return false;

正则表达式检查任何禁止模式的匹配:

  • ^\s开头的空格
  • \s$最后一个空格
  • \s\s两个连续的空白字符
  • [^A-Za-z.\s]不是字母、句点或空格的字符

如果您只允许空格 (ASCII 32),而不是制表符或其他空白字符,您可以将 all 替换\s为文字空格字符。

另一种解决方案是结合使用“肯定”表达式来检查允许的字符和长度,使用“否定”表达式来排除被拒绝的模式:

return str.match(/[A-Za-z. ]){8,20}/) && !str.match(/(^ | $|  )/);

更新:如果您需要将所有内容放入一个表达式中,恐怕您必须省略对连续空格的检查,因为此限制使语言对上下文敏感,因此无法通过正则表达式检查。您可以做的是检查以字母开头、后跟 6 到 18 个字母、点或空格并以字母结尾的字符串:

[A-Z][A-Z. ]{6,18}[A-Z]
于 2014-01-05T10:50:46.993 回答