【问题标题】:RegExp matching string not starting with my正则表达式匹配字符串不是以我的开头
【发布时间】:2011-01-08 03:34:41
【问题描述】:

对于 PMD,我希望有一个规则来警告我那些以 my 开头的丑陋变量。
这意味着我必须接受所有my开头的变量。

所以,我需要一个 RegEx (re),其行为如下:

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

我尝试了不同的方法,但还没有成功。

【问题讨论】:

  • 我认为这实际上应该是消极的展望(而不是消极的展望)。

标签: regex regex-negation pmd


【解决方案1】:
^(?!my)\w+$

应该可以。

它首先确保不可能在字符串的开头匹配my,然后匹配字母数字字符直到字符串的结尾。字符串中任何地方的空格都会导致正则表达式失败。根据您的输入,您可能希望在将字符串传递给正则表达式之前去除字符串前后的空格,或者使用向正则表达式添加可选的空格匹配器,如^\s*(?!my)(\w+)\s*$。在这种情况下,反向引用 1 将包含变量的名称。

如果你需要确保你的变量名以某组字符开头,比如[A-Za-z_],使用

^(?!my)[A-Za-z_]\w*$

注意从+* 的变化。

【讨论】:

    【解决方案2】:
    /^(?!my).*/
    

    (?!expression) 是负前瞻;它匹配expression 从该位置开始匹配的位置。

    【讨论】:

      【解决方案3】:

      您可以像其他人建议的那样使用前瞻断言。或者,如果您只想使用基本的正则表达式语法:

      ^(.?$|[^m].+|m[^y].*)
      

      这匹配长度为 0 或 1 个字符的字符串 (^.?$),因此不能是 my。或者具有两个或更多字符的字符串,当第一个字符不是m 时,后面可能会出现更多字符(^[^m].+);或者如果第一个字符是m,则后面不能跟y (^m[^y])。

      【讨论】:

      • 这是我们现在可以使用的。扩展的正则表达式似乎有问题,但这个现在可以正常工作。
      【解决方案4】:

      进行肯定匹配并拒绝那些字符串,而不是匹配否定以找到要接受的字符串,难道不是更易读吗?

      /^my/
      

      【讨论】:

      • 这会更容易,但是(是)在提交到存储库时检查代码的规则需要它,因此无法“恢复”逻辑。
      猜你喜欢
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2015-02-26
      • 2016-07-12
      • 2019-10-15
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多