【问题标题】:Exclamation symbol in regular expression [duplicate]正则表达式中的感叹号[重复]
【发布时间】:2018-06-04 23:22:32
【问题描述】:

在使用正则表达式时,我发现了一个问题。任何人都可以为以下情况给出适当的理由

场景一

var regExp=/^[a-zA-Z0-9!-@#$^_:,. ]$/;
regExp.test('<')// True

场景 2

var regExp=/^[a-zA-Z0-9-!@#$^_:,. ]$/;
regExp.test('<')// false

正则表达式中感叹号位置发生变化。

【问题讨论】:

  • !-@ 是一个范围字符,其中包括&lt;。在第二个例子中,- 的位置意味着它只是一个-。请注意,您可以使用 regex101.com 之类的东西来测试您的表达式并了解它们匹配的内容。
  • 你能简单介绍一下吗......
  • 是的,你是对的。措辞不好。我应该说它不会像你期望的那样工作。您的评论更好地涵盖了它。
  • 密切相关:stackoverflow.com/questions/5484084/… 不确定是否值得欺骗......

标签: javascript jquery regex


【解决方案1】:

第一个正则表达式

var regExp=/^[a-zA-Z0-9!-@#$^_:,. ]$/;

!-@ 匹配字符范围。根据ASCII 的值,它包括&lt;

原因

  • a-z - 匹配 az 字符
  • A-Z - 匹配 AZ 字符
  • 0-9 - 匹配 09 字符
  • !-@ 匹配 !@ 字符
  • #$^_:,. 字符将被匹配

第二个正则表达式

var regExp=/^[a-zA-Z0-9-!@#$^_:,. ]$/;

- 正常工作 - 字符然后这个正则表达式不匹配 &lt;

原因

  • a-z - 匹配 az 字符
  • A-Z - 匹配 AZ 字符
  • 0-9 - 匹配 09 字符
  • -!@#$^_:,. 字符将被匹配。

希望你明白了

【讨论】:

  • 在第二种情况下添加 why 它只是 - 可能会有所帮助,以及如何使其位置变得不重要以避免错误。
  • @jonrsharpe 更新了答案,感谢您的建议
  • 我认为你没有回答 jonrsharpe 的问题。 9-! 不作为第二个正则表达式中的范围,因为 9 已经是 0-9 范围的一部分。 (9-! 无论如何都不是有效范围,因为! 在 ASCII 顺序中位于 9 之前。)同样,在字符类的开头或结尾处的 - 是文字,例如在 /[-a]/ 中, /[a-]/ 甚至是否定字符类 /[^-a]/。我个人不喜欢这个功能。我认为它来自正则表达式在 Perl 中的起源。字符类中的\- 将始终匹配文字-,我更喜欢这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多