【问题标题】:JavaScript regular expressions to match no digits, whitespace and selected symbols不匹配数字、空格和选定符号的 JavaScript 正则表达式
【发布时间】:2015-09-13 10:47:42
【问题描述】:

感谢观看。

我的目标是提出一个正则表达式,它将匹配不包含数字、空格或符号 !@£$%^&*()+= 或我可以选择的任何其他符号的输入。

然而,我很难准确掌握正则表达式的工作原理。

我从简单的模式/\D/ 开始,据我了解,它将匹配它可以找到的第一个非数字字符。这将匹配正确的字符串“James”,但也匹配我不想要的“James1”。

所以,我的理解是,如果我想确保在给定字符串的任何地方都找不到模式,我使用^ 和$ 字符,如/^\D$/。现在因为这只会匹配一个不是数字的字符,所以我需要使用+ 来指定不应在整个字符串中找到 1 个或多个数字,给我表达式 /^\D+$/。太棒了,它不再匹配“James1”。

问题 1

到目前为止我的推理是否正确?

下一个要求是确保给定字符串中没有空格。 \s 将匹配单个空格,[^\s] 将匹配第一个非空格字符。因此,根据我的理解,我只需将其添加到我已有的内容中即可匹配不包含数字和空格的字符串。同样,因为[^\s] 只会匹配一个非空白字符,所以我使用+ 匹配一个或多个空白字符,给出/^\D+[^\s]+$/ 的新正则表达式。

这是我迷路的地方,因为表达式现在匹配“James1”甚至“James Smith25”。 什么?在这一点上非常困惑。

问题 2

为什么/^\D+[^\s]+$/ 匹配包含空格的字符串?

问题 3

我将如何编写我要解决的正则表达式?

虽然我热衷于解决问题,但我更感兴趣的是找出我对正则表达式的理解不足的地方,因此任何解释都会有所帮助。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:
    1. 不完全; ^ 和 $ 实际上是“锚点”——它们的意思是“开始”和“结束”,实际上有点复杂,但你可以认为它们表示开始和现在行尾 - 如果您有兴趣了解更多相关信息,请查看正则表达式上的各种修饰符。不幸的是 ^ 有一个重载的含义;如果在方括号内使用,则表示“不”,这是您已经熟悉的含义。理解这两种含义之间的区别非常重要,并且您脑海中的定义实际上仅适用于字符范围匹配!

      进一步使您感到困惑的是 \d 表示“数字”,而 \D 表示“不是数字”。类似地,\s 表示“空格(空格/制表符/换行符/等)字符”,\S 表示“不是空格字符”。

      值得注意的是 \d 实际上是 [0-9] 的快捷方式(注意 - 在 square 内有特殊含义括号),而 \D 是 [^0-9] 的快捷方式。

    2. 它匹配包含空格的字符串的原因是您要求“1+ 非数字数字后跟 1+ 非空格字符” - 所以它会匹配很多字符串!我认为您可能不了解正则表达式匹配字符串位,您不是在添加约束,而是构建匹配器的机器人来匹配相应字符串的位。

    3. /^[^\d\s!@£$%^&*()+=]+$/ 是您正在寻找的答案 - 我会这样看:

      我。 [] - 匹配一系列字符

      二。 []+ - 匹配该范围内的一个或多个字符

      三。 [^\d\s]+ - 匹配一个或多个不匹配\d(数字)或\s(空白)

      的字符

      四。 [^\d\s!@£$%^&*()+=]+ - 这里有一堆我不想让你匹配的其他角色

      v. ^[^\d\s!@£$%^&*()+=]+$ - 现在已经应用了锚点,所以这个匹配器必须应用到整行,否则匹配失败

    探索正则表达式的有用网站是http://regexr.com/3b9h7 - 我提供了我建议的解决方案作为示例。 编辑:Pruthvi Raj 的 debuggerx 链接很棒!

    【讨论】:

      【解决方案2】:

      到目前为止我的推理是否正确?

      几乎。 /\D/ 匹配除数字以外的任何字符,但不仅仅是第一个字符(如果您使用 g 选项)。

      和 [^\s] 将匹配第一个非空白字符

      几乎,[^\s] 将匹配 任何 非空白字符,而不仅仅是第一个字符(如果您使用 g 选项)。

      /^\D+[^\s]+$/ 匹配包含空格的字符串?

      是的,确实如此,因为\D 匹配一个空格(空格不是数字)。

      为什么 /^\D+[^\s]+$/ 匹配包含空格的字符串?

      因为/^\D+[^\s]+$/中的\D+可以匹配空格。

      结论:

      使用

      ^[^\d\s!@£$%^&*()+=]+$
      

      It will match strings that have no digits and spaces, and the symbols you do not allow.

      请注意,要将文字 -、] 或 [ 与字符类匹配,您需要对它们进行转义,或者在表达式的开头或结尾使用。为了安全起见,请逃离他们。

      【讨论】:

      • 看起来我忽略了!@£$%^&*()+= 要求,只是将它们添加到最终解决方案中。我也希望我的最后笔记对你有用。
      【解决方案3】:

      只需将您不想包含在否定字符类中的每个字符插入如下:

      ^[^\s\d!@£$%^&*()+=]*$
      

      DEMO

      Debuggex Demo

      ^ - start of the string
      [^...] - matches one character that is not in `...`
      \s - matches a whitespace (space, newline,tab)
      \d - matches a digit from 0 to 9
      * - a quantifier that repeats immediately preceeding element by 0 or more times
      

      所以正则表达式匹配任何具有

      的字符串
      1. string that has a beginning
      2. containing 0 or more number of characters that is not whitesapce, digit, and all the symbols included in the character class ( In this example !@£$%^&*()+=) i.e., characters that are not included in the character class `[...]`
      3.that has ending
      

      注意:

      如果你不希望它有的符号还包括-,一个连字符,不要把它放在其他一些字符之间,因为它是字符类中的元字符,把它放在字符类的最后

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2011-02-11
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2023-04-02
        相关资源
        最近更新 更多