Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并Regexp?_Regex - Fatal编程技术网

合并Regexp?

合并Regexp?,regex,Regex,收集用户输入的各种条件后,如 开头为:/(^@)/ 以:/(@$)/ 包含:/@/ 不包含 若要在用户输入多个条件时生成单个正则表达式, 我将它们与“|”组合,因此如果给定的1和2变成/(^@)|(@$)/ 到目前为止,这种方法有效,但是 我无法正确确定,第4个条件的正则表达式应该是什么?用这种方式合并正则表达式有效吗 更新:@(用户输入)将不相同 有两种情况,而不是全部四种情况 条件总是存在的,但它们可以 是的,将来我可能需要更多 像“是”和“是”这样的条件 完全不是“等等”,所以我更好奇

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

  • 开头为:
    /(^@)/
  • 以:
    /(@$)/
  • 包含:
    /@/
  • 不包含
  • 若要在用户输入多个条件时生成单个正则表达式, 我将它们与
    “|”
    组合,因此如果给定的1和2变成
    /(^@)|(@$)/

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

    我无法正确确定,第4个条件的正则表达式应该是什么?用这种方式合并正则表达式有效吗


    更新:@(用户输入)将不相同 有两种情况,而不是全部四种情况 条件总是存在的,但它们可以 是的,将来我可能需要更多 像“是”和“是”这样的条件 完全不是“等等”,所以我更好奇 要知道这种方法是否可以扩展

    此外,还可能存在用户输入问题 清理,以便正则表达式正确转义,但是 这一点现在被忽略了

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


    如果组合的预期结果是其中任何一个匹配会导致整个regexp匹配,则组合有效。

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

    /^[^@]*$/
    
    这将匹配不包含
    @
    的任何长度的字符串


    另一个可能的解决方案是反转
    /@/

    的布尔结果。根据我对regex的经验,您确实需要关注您正试图匹配的内容,而不是不匹配的内容

    比如说

    \d{2}
    
    [1-9][0-9]
    
    第一个表达式将匹配任意2个数字…第二个表达式将匹配1到9之间的1个数字和1个数字-任意数字。因此,如果键入07,第一个表达式将验证它,但第二个表达式不会验证它

    有关高级参考,请参见此:

    编辑:


    ^((?!我的字符串)。*$
    是的正则表达式,不包含“我的字符串”

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

    条件将一起进行or或AND运算吗

    Starts with: abc Ends with: xyz Contains: 123 Doesn't contain: 456 第四种选择可能看起来很奇怪,但这就是在正则表达式中表示“不包含”的方式。顺便说一下,备选方案的顺序并不重要;这实际上是相同的正则表达式:

    /xyz$|^(?:(?!456).)*$|123|^abc/
    
    和版本更复杂。每个正则表达式匹配后,匹配位置必须重置为零,以便下一个正则表达式可以访问整个输入。这意味着所有条件都必须表示为lookaheads(从技术上讲,其中一个条件不必是lookahead,我认为它以这种方式更清楚地表达了意图)。最后一个
    *$
    完成匹配

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

    然后有可能出现组合And和OR条件——这才是真正有趣的开始D

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

    /^@[^@]*@?$|^@?[^@]*@$/
    
    这几乎是一样的:

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

    但是这一个匹配任何不带@的字符串,示例“my name is hal9000”

    您能否使用上述建议提供有关如何匹配“不包含”条件的更多详细信息。我假设您想要一个“不包含”某些内容的表达式(不清楚您希望表达式不包含什么内容)。我的建议是,如果您不希望表达式的第一个位置包含数字0,那么您将如何操作,在这种情况下,您将第一个位置的数字限制为1-9。不太清楚你所说的“不包含”是什么意思。不包含什么?请澄清,以便我们能够帮助您。我的回答更为笼统。若那个对你们并没有帮助,那个么很抱歉。更新:合并正则表达式的目的是将if条件减少为single。因为这个正则表达式将匹配大量的字符串。你说的“不包含”是什么意思?如果用户输入的是“酷”字符串不包含那个词意味着它匹配。你们真的需要正则表达式吗?或者一个简单的字符串搜索就足够了吗?我想不出把上面的多个搜索条件压缩成一个不带正则表达式的条件。有其他方法吗?@对于两个条件来说是不一样的,并且并非所有四个条件都始终存在,但它们可以存在,而且将来我可能需要更多的条件,如“完全正确”和“完全不正确”等。所以,我更想知道这种方法是否可以扩展?是的,我现在同意。但是谢谢你把它放在这里。组合AND和OR不适合我。:)我尝试了最后一个和regex,我注意到它有一个语法错误,在最后有一个额外的“)”。我删除了这个字符,但正则表达式似乎没有按预期工作,不知道我做错了什么?我正在使用.Net进行测试。它实际上是倒数第二个不属于那里的
    。一旦这个问题解决了,它就不起作用了,因为它里面没有任何东西会消耗角色,只是看起来像头。我可以让最后一部分不是前瞻性的,但为了清晰起见,我宁愿在结尾添加一个
    *
    。我现在正在修理它;谢谢你提醒我。
    /^@?[^@]*@?$/