在字符串中禁止两个连续的空格,需要使用正则表达式。

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>

2
你好,欢迎来到StackOverflow!首先,我认为如果您熟悉编辑器的格式选项,这将是一个好主意 - 您所述的问题实际上并没有反映出您的要求。这一次我会帮您做到这一点,这样您就可以看到它是如何工作的。其次,您并没有真正提出问题 - 您在哪个部分遇到了困难?第三,您使用的是哪种语言?所有这些主题都在帮助页面和正则表达式FAQ中有涵盖。 - Tim Pietzcker
1
我一定会尽快学习它。谢谢你的帮助 :) @Tim Pietzcker - Afnan Ahmad
2个回答

3
这里有一个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)

我正在使用asp.net用户控件正则表达式验证器,像这样<asp:RegularExpressionValidator ID="revDescription" runat="server" ControlToValidate="taDescription" Display="Dynamic" ErrorMessage="Invalid Description." Text="&nbsp" ValidationExpression="^(?![ ])(?!.*[ ]{2})(?!.*[ ]$)[A-Z. ]{8,20}$"></asp:RegularExpressionValidator>。请问你能指导我吗?你建议的正则表达式不起作用。 - Afnan Ahmad
@AfnanAhmad:你没有将正则表达式设置为不区分大小写。在正则表达式的开头添加“(?i)”即可。 - Tim Pietzcker
非常感谢,我已经完成了。 我进行了以下更改。 <asp:RegularExpressionValidator ID="revDescription" runat="server" ControlToValidate="taDescription" Display="Dynamic" ErrorMessage="Invalid Description." Text=" " ValidationExpression="^(?i)(?![ ])(?!.*[ ]{2})(?!.*[ ]$)[A-Z. ]{8,20}$"></asp:RegularExpressionValidator>。我真的很感激你。 我已经搜索了很多,但最后你给了我答案。太棒了 :) - Afnan Ahmad

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),而不是制表符或其他空格字符,则可以将所有\s替换为实际的空格字符。

另一种解决方案是将“正”表达式与“负”表达式相结合,以检查允许的字符和长度,并排除被拒绝的模式:

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

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

[A-Z][A-Z. ]{6,18}[A-Z]

我正在使用asp.net的正则表达式验证器。我已经按照您的建议更改了代码,但没有成功。以下是代码:<asp:RegularExpressionValidator ID =“revDescription”runat =“server” ControlToValidate =“taDescription”Display =“Dynamic”ErrorMessage =“无效描述。” Text =“&nbsp” ValidationExpression =“/(^ \ s | \ s $ | \ s \ s | [^ A-Za-z. \ S])/”> </ asp:RegularExpressionValidator> - Afnan Ahmad
我已经完成了最小值和最大值的验证。我将通过在文本框中应用Maxlength来实现这一点。现在我只想不允许在开头和结尾有空格,并且不允许在中间有两个连续的空格。不匹配=(Hello world)=(Hello World) - Afnan Ahmad
连续的空格是我遇到的主要问题,我已经解决了开头和结尾的空格,像这样^[a-zA-Z][.\s\a-zA-Z]*[a-zA-Z.]$。我只是不希望用户输入连续的空格。 - Afnan Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接