【问题标题】:RegEx for no whitespace at the beginning and end正则表达式的开头和结尾没有空格
【发布时间】:2023-03-03 18:46:01
【问题描述】:

我想设计一个表达式,不允许在字符串的开头和结尾有空格,但允许在字符串的中间。

我试过的正则表达式是这样的:

\^[^\s][a-z\sA-Z\s0-9\s-()][^\s$]\

【问题讨论】:

  • 角度如何相关?什么样的正则表达式?对于 JavaScript,如 ECMA-262 中定义的那样?您是否在 js 代码中使用正则表达式文字?你为什么不直接用文字描述语言。像这样:“不以空格开头或结尾的单词集。”但是空词呢?
  • 正则表达式将难以阅读和理解。这个表达式会简单得多:str.trim() === str

标签: angularjs regex regex-negation


【解决方案1】:

这应该可行:

^[^\s]+(\s+[^\s]+)*$

如果要包括字符限制:

^[-a-zA-Z0-9-()]+(\s+[-a-zA-Z0-9-()]+)*$

解释:

开头^ 和结尾$ 表示字符串。

考虑到我给出的第一个正则表达式,[^\s]+ 表示 at least one not whitespace\s+ 表示 at least one white space。另请注意,括号() 将第二个和第三个片段组合在一起,最后的* 表示zero or more of this group。 所以,如果你看一下,表达式是:begins with at least one non whitespace and ends with any number of groups of at least one whitespace followed by at least one non whitespace

例如,如果输入是“A”,那么它匹配,因为它与begins with at least one non whitespace 条件匹配。出于同样的原因,输入“AA”匹配。输入“A A”也匹配,因为第一个 A 匹配 at least one not whitespace 条件,然后“A”匹配 any number of groups of at least one whitespace followed by at least one non whitespace

“A”不匹配,因为不满足 begins with at least one non whitespace 条件。 'A' 不匹配,因为不满足 ends with any number of groups of at least one whitespace followed by at least one non whitespace 条件。

如果您想限制在开始和结束时接受哪些字符,请参阅第二个正则表达式。我在开头和结尾都允许使用 a-z、A-Z、0-9 和 ()。只有这些是允许的。

正则表达式操场:http://www.regexr.com/

【讨论】:

  • 请注意,这将拒绝空词。不清楚这是否正确。
  • 我不想在开头也允许结尾处的空格......应该允许中间的空格
  • 还解释了每个字符的正则表达式,因为我是新手
【解决方案2】:

此正则表达式不允许在字符串/单词的开头或结尾出现空格。

^[^\s].+[^\s]$

任何不以空格开头或结尾的字符串都将被匹配。

说明:

  1. ^ 表示字符串的开头。
  2. \s 表示空白,因此[^\s] 表示 NOT white-space。您也可以使用\S 来表示相同的意思。
  3. . 表示除换行符之外的任何字符。
  4. + 是一个量词,表示 - 一次或多次。这意味着,+ 后面的字符可以重复多次。

您可以使用 this 作为 RegEx 备忘单。

【讨论】:

  • 我们怎样才能让它在没有 3 个字符限制的情况下工作?因此,即使用户输入一个字符,它也应该通过验证
【解决方案3】:

如果字符串必须至少有 1 个字符长,如果中间允许换行符和任何其他字符一起出现,并且第一个+最后一个字符实际上可以是除空格以外的任何字符(包括 @#$!...),那么您正在寻找:

^\S$|^\S[\s\S]*\S$

解释和单元测试:https://regex101.com/r/uT8zU0

【讨论】:

    【解决方案4】:

    如果您有一个特定的模式,例如 ^[a-zA-Z0-9\s()-]+$,您想要调整以使开头和结尾处的空格不被允许,您可以使用锚定在模式开头的前瞻:

    ^(?!\s)(?![\s\S]*\s$)[a-zA-Z0-9\s()-]+$
     ^^^^^^^^^^^^^^^^^^^^ 
    

    这里,

    • (?!\s) - 如果(因为它在 ^ 之后)紧接在字符串开头有一个空格字符,则匹配失败的负前瞻
    • (?![\s\S]*\s$) - 如果(因为它也在^ 之后执行,前一个模式是一个不是消耗模式的环视),则匹配失败的否定前瞻)立即在字符串的开头,有任何 0+ 字符尽可能多([\s\S]*,等于[^]*),然后在字符串末尾添加一个空格字符($)。

    在 JS 中,您可以使用以下等效的正则表达式声明:

    var regex = /^(?!\s)(?![\s\S]*\s$)[a-zA-Z0-9\s()-]+$/
    var regex = /^(?!\s)(?![^]*\s$)[a-zA-Z0-9\s()-]+$/
    var regex = new RegExp("^(?!\\s)(?![^]*\\s$)[a-zA-Z0-9\\s()-]+$")
    var regex = new RegExp(String.raw`^(?!\s)(?![^]*\s$)[a-zA-Z0-9\s()-]+$`)
    

    如果您知道没有换行符,[\s\S][^] 可以替换为 .

    var regex = /^(?!\s)(?!.*\s$)[a-zA-Z0-9\s()-]+$/
    

    请参阅regex demo

    JS 演示:

    var strs = ['a  b c', ' a b b', 'a b c '];
    var regex = /^(?!\s)(?![\s\S]*\s$)[a-zA-Z0-9\s()-]+$/;
    for (var i=0; i<strs.length; i++){
      console.log('"',strs[i], '"=>', regex.test(strs[i]))
    }

    【讨论】:

      【解决方案5】:

      怎么样:

      ^\S.+\S$
      

      这将匹配任何不以任何空格开头或结尾的字符串。

      【讨论】:

      • . 将匹配 \n 或不基于多行标志,并且字符串必须至少有 3 个字符长...
      【解决方案6】:
      ^[^\s].+[^\s]$
      

      就是这样!!!!它允许任何包含任何字符(来自 \n 的一部分)的字符串的开头或结尾没有空格;如果您希望 \n 在中间有一个选项 s,您必须将 .+ 替换为 [.\n]+

      【讨论】:

      • 它需要两个字符来匹配
      【解决方案7】:

      这是一个正则表达式,开头和结尾都没有空格,但只有一个空格。也可以在没有 3 个字符限制的情况下使用:

      \^([^\s]*[A-Za-z0-9]\s{0,1})[^\s]*$\ - 只需删除 {0,1} 并添加 * 以便在它们之间有无限的空间。

      【讨论】:

      • 目前我只能添加 2 个单词。我怎样才能消除这个限制并能够输入我想要的字数?
      【解决方案8】:

      这对我有用:

      ^[^\s].+[a-zA-Z]+[a-zA-Z]+$
      

      希望对你有帮助。

      【讨论】:

        【解决方案9】:

        pattern="^[^\s]+[-a-zA-Z\s]+([-a-zA-Z]+)*$" 这将帮助您只接受字符,并且不允许开头有空格,也不允许空格。

        【讨论】:

          【解决方案10】:

          字母和数字只除以一个空格。此外,开头和结尾不允许有空格。

          /^[a-z0-9]+( [a-z0-9]+)*$/gi
          

          【讨论】:

            【解决方案11】:

            使用/^[^\s].([A-Za-z]+\s)*[A-Za-z]+$/。这个。它只接受单词之间的一个空格,并且开头和结尾没有更多的空格

            【讨论】:

              【解决方案12】:
              ^[^0-9 ]{1}([a-zA-Z]+\s{1})+[a-zA-Z]+$
              

              -for 之间不能超过一个空格,第一个和最后一个不能有空格。

              ^[^0-9 ]{1}([a-zA-Z ])+[a-zA-Z]+$
              

              - 之间有多个空格,第一个和最后一个没有空格。

              【讨论】:

                【解决方案13】:

                作为@Aprillion 答案的修改,我更喜欢:

                ^\S$|^\S[ \S]*\S$
                
                • 它不会匹配开头、结尾或两者的空格。
                • 它匹配字符串开头和结尾的非空白字符之间的任意数量的空格。
                • 它也只匹配一个非空白字符(与此处的许多答案不同)。
                • 它不会匹配字符串中的任何换行符 (\n)、\r、\t、\f 或 \v(与 Aprillion 的答案不同)。我意识到这对问题并不明确,但这是一个有用的区别。

                【讨论】:

                  【解决方案14】:

                  其他答案会限制匹配的长度。这可以通过使用 Negative lookaheads 和 lookbehinds 来避免:

                  ^(?!\s)([a-zA-Z0-9\s])*?(?<!\s)$
                  

                  首先检查第一个字符是否不是空格^(?!\s)。然后它以非贪婪的方式捕获a-zA-Z0-9\s 所需的字符(*?),并通过检查$(字符串/行的结尾)之前的字符是否不是\s 而结束。

                  检查您的平台/浏览器是否支持前瞻/后视。

                  【讨论】:

                  • 我使用的是响应式形式,该模式可以帮助我解决这个问题 "^(?!\\s)(?![^]*\\s$)[a-zA-Z0 -9\\s()-]+$"
                  【解决方案15】:

                  我发现一个可靠的方法就是指定你想要允许的第一个字符并检查其他字符是否正常,例如在 JavaScript 中:

                  RegExp("^[a-zA-Z][a-zA-Z- ]*$")
                  

                  因此该表达式在开头只接受一个字母,然后是任意数量的字母、连字符或空格。

                  【讨论】:

                    【解决方案16】:

                    给你,

                    \b^[^\s][a-zA-Z0-9]*\s+[a-zA-Z0-9]*\b
                    

                    • \b 指单词边界
                    • \s+ 表示在中间允许一个或多个空格。

                    【讨论】:

                      【解决方案17】:
                      (^(\s)+|(\s)+$)
                      

                      这个表达式将匹配文章的第一个和最后一个空格..

                      【讨论】:

                      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-07-07
                      • 2021-09-01
                      • 1970-01-01
                      • 2018-08-14
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多