结合 Regexp?

在收集用户输入的各种条件之后,如

  1. /(^@)/开始
  2. 结尾: /(@$)/
  3. 含量: /@/
  4. 不包含

若要在用户输入多个条件时创建单个正则表达式, 我把它们和 "|"结合起来,所以如果1和2给它就变成了 /(^@)|(@$)/

这个方法到目前为止是有效的,但是,

我不能正确地确定,第四个条件的正则表达式应该是什么?用这种方法组合 regex 可以吗?


更新:@(用户输入)不一样 只有两个条件,而不是全部四个 条件总是存在,但它们可以 将来我可能需要更多 像“正是”和“正是”这样的条件 所以,我更好奇 知道这种方法可以扩大规模吗?

此外,还可能存在用户输入问题 所以正则表达式正确地逃脱,但 现在被忽略了。

207864 次浏览

不包含@:/(^ [ ^@] * $)/

如果组合的预期结果是其中任何匹配都会导致整个 regexp 匹配,那么组合就可以工作。

如果字符串不能包含 @,那么每个字符必须是 @以外的另一个字符:

/^[^@]*$/

这将匹配不包含 @的任何长度的任何字符串。

另一个可能的解决方案是反转 /@/的布尔结果。

根据我使用正则表达式的经验,您确实需要关注您试图匹配的确切内容,而不是不匹配的内容。

比如说

\d{2}


[1-9][0-9]

第一个表达式将匹配任意2个数字... ... 第二个表达式将匹配1个从1到9的数字和1个数字-任意数字。因此,如果键入07,第一个表达式将验证它,但第二个表达式将不验证它。

参考以下内容:

Http://www.regular-expressions.info/refadv.html

编辑:

^((?!my string).)*$是不包含“ my string”的正则表达式。

将第四个选项的正则表达式与其他任何选项组合在一个正则表达式中都不起作用。4 + 1意味着字符串要么以@开头,要么根本不包含@。你需要两个独立的比较来做这个。

这些条件是一起进行 ORE 还是 AND?

Starts with: abc
Ends with: xyz
Contains: 123
Doesn't contain: 456

OR 版本相当简单; 正如您所说的,它主要是在各个条件之间插入管道。只要其中一个备选方案匹配,正则表达式就停止查找匹配。

/^abc|xyz$|123|^(?:(?!456).)*$/

第四种选择可能看起来很奇怪,但这就是在正则表达式中表达“不包含”的方式。顺便说一下,其他选项的顺序并不重要; 这实际上是相同的 regex:

/xyz$|^(?:(?!456).)*$|123|^abc/

AND 版本更复杂。在每个单独的正则表达式匹配之后,必须将匹配位置重置为零,以便下一个正则表达式可以访问整个输入。这意味着所有的条件都必须表示为前瞻(从技术上讲,其中一个条件不必是前瞻,我认为这样可以更清楚地表达意图)。最后的 .*$完成了比赛。

/^(?=^abc)(?=.*xyz$)(?=.*123)(?=^(?:(?!456).)*$).*$/

然后还有结合 AND 和 OR 条件的可能性——这才是真正有趣的开始

1 + 2 + 4条件: 开始 | 结束,但不在中间

/^@[^@]*@?$|^@?[^@]*@$/

几乎是一样的:

/^@?[^@]*@?$/

但是这个匹配没有@的任何字符串,示例‘ my name is hal9000’