结合Regexp?

时间:2009-05-15 17:01:43

标签: regex

收集用于

等各种条件的用户输入
  1. 以:/(^@)/
  2. 开头
  3. 结束于:/(@$)/
  4. 包含:/@/
  5. 不包含
  6. 如果用户输入多个条件,则制作单个正则表达式 我将它们与"|"结合使用,如果1和2变为/(^@)|(@$)/

    此方法目前有效,但

    我无法正确判断,该条件应该是什么样的正则表达式?结合正则表达式这种方式有效吗?


      

    更新:@(用户输入)不一样   两个条件,而不是全部四个   条件总是存在,但他们可以   将来我可能需要更多   像“确切”和“是”这样的条件   完全不是“等等,所以,我更好奇   要知道这种方法会扩展吗?

         

    也可能存在用户输入问题   清理所以正则表达式正确逃脱,但是   现在被忽略了。

6 个答案:

答案 0 :(得分:82)

条件是ORed还是AND在一起?

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

OR版本相当简单;正如你所说,这主要是在各个条件之间插入管道。只要其中一个替代品匹配,正则表达式就会停止寻找匹配。

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

第四种选择可能看起来很奇怪,但这就是你在正则表达式中表达“不包含”的方式。顺便说一下,替代品的顺序无关紧要;这实际上是相同的正则表达式:

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

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

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

然后有可能结合AND和OR条件 - 这就是真正的乐趣开始的地方。 :d

答案 1 :(得分:3)

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

如果组合的预期结果是任何匹配的结果导致整个正则表达式匹配,则组合起作用。

答案 2 :(得分:3)

如果字符串不能包含@,则每个字符必须是@以外的其他字符:

/^[^@]*$/

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

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

答案 3 :(得分:2)

根据我对正则表达式的体验,你真的需要关注你想要匹配的东西,而不是那些不匹配的东西。

例如,

\ d {2}

[1-9] [0-9]

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

请参阅此内容以获得高级参考:

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

编辑:

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

答案 4 :(得分:2)

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

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

几乎与:

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

但是这个匹配任何没有@的字符串,样本'我的名字是hal9000'

答案 5 :(得分:1)

将第四个选项的正则表达式与任何其他选项组合在一个正则表达式中不起作用。 4 + 1表示字符串以@开头或根本不包含@。你需要进行两次单独的比较才能做到这一点。