【问题标题】:Regex lookahead logical 'OR' - to exclude certain patterns正则表达式前瞻逻辑“或” - 排除某些模式
【发布时间】:2019-09-02 17:48:28
【问题描述】:

我见过很多执行逻辑与的密码验证示例。 例如,密码必须有

  • 至少一位数 (AND)
  • 至少一个字符 (AND)
  • 长度在 6 到 15 之间

这可以用正则表达式'positive lookahead'写成:

var includePattern = @"^(?=.*\d)(?=.*[a-zA-z]).{6,15}$"; 
bool tfMatch = Regex.IsMatch("Password1", includePattern); //
if (tfMatch)
    //continue... valid thus far...

我的问题是我想排除某些组或模式,本质上是做一个逻辑“或”;例如,假设我要匹配(以便在以下任何一项为真时使密码无效):

  • 至少找到一个空间(或)
  • 至少找到一个单引号 (OR)
  • 找到至少一个双引号 (OR)
  • 野兽的字符串“666”号

在 excludePattern 上寻求帮助.. 积极前瞻?负前瞻?

var excludePattern = @"^( ...xxx...  $"; //<== **** what goes in here??
bool tfMatch = Regex.IsMatch("Pass 666 word", excludePattern); //
if (tfMatch)
    //DONT continue... contains excluded

我正在使用 c# 正则表达式,但任何风格都可以开始使用。

【问题讨论】:

  • 只是消极的前瞻来寻找你想要排除的模式之间的交替?
  • CertainPerformance.. 不知道,甚至不知道从哪里开始.. 在正则表达式方面和新手一样好。如果我的问题很清楚,请写下答案。它也可以帮助其他人。

标签: regex negative-lookbehind positive-lookahead


【解决方案1】:

就像您可以使用多个正向预读来检查字符串是否满足多个正向模式一样,您可以在负向预读中交替以检查预读中的交替模式是否与字符串匹配。例如,对于您的

至少找到一个空间(或)

找到至少一个单引号 (OR)

找到至少一个双引号 (OR)

野兽的字符串“666”号

你可以使用

^(?!.* |.*'|.*"|.*666)<rest of your pattern>

https://regex101.com/r/u9BoIl/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多