Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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
Ruby 正则表达式来匹配我的单词模式,wild chars_Ruby_Regex - Fatal编程技术网

Ruby 正则表达式来匹配我的单词模式,wild chars

Ruby 正则表达式来匹配我的单词模式,wild chars,ruby,regex,Ruby,Regex,你能帮我吗 我希望我的Ruby程序有一个正则表达式来匹配下面模式的单词 图案有 字母列表(例如.ABCC=>1A、1B、2C) N个通配符(N可以是0、1或2) 固定词(例如“XY”) 规则: 关于字母列表,它应该与单词匹配 a。0或1 A b。0或1b c。0或1或2 C 根据N的值,可以有0、1或2个野生字符 固定词总是按照给定的顺序排列 所有这些的组合可以是任意顺序,并且应该与下面的单词匹配 ABWXY(如果野生字符=1) 贝西 CXYCB 但不是2个A或2个B的词 我使用的模式类似于^[

你能帮我吗

我希望我的Ruby程序有一个正则表达式来匹配下面模式的单词

图案有

  • 字母列表(例如.ABCC=>1A、1B、2C)
  • N个通配符(N可以是0、1或2)
  • 固定词(例如“XY”)
  • 规则:

  • 关于字母列表,它应该与单词匹配

    a。0或1 A

    b。0或1b

    c。0或1或2 C

  • 根据N的值,可以有0、1或2个野生字符
  • 固定词总是按照给定的顺序排列
  • 所有这些的组合可以是任意顺序,并且应该与下面的单词匹配
  • ABWXY(如果野生字符=1)

    贝西

    CXYCB

    但不是2个A或2个B的词

    我使用的模式类似于^[ABCC]*.XY$


    但它会查找超过1 A、1 B或2 C的单词,也会查找以XY结尾的单词,我希望所有的单词在任何位置都有XY,字母和字符在任何位置。

    你需要正确地打破你的模式。在regexp术语中,
    [ABCC]
    表示“A、B或C中的任何一个”,其中重复的C被忽略。它是一个集合运算符,而不是像
    ()
    那样的分组运算符

    您所描述的似乎是基于参数创建一个regexp。您可以通过将字符串传递给
    Regexp.new
    并使用结果来完成此操作

    例如:

    def match_for_options(options)
      pattern = '^'
    
      pattern << 'A' * options[:a] if (options[:a])
      pattern << 'B' * options[:b] if (options[:b])
      pattern << 'C' * options[:c] if (options[:c])
    
      Regexp.new(pattern)
    

    你需要适当地打破你的模式。在regexp术语中,
    [ABCC]
    表示“A、B或C中的任何一个”,其中重复的C被忽略。它是一个集合运算符,而不是像
    ()
    那样的分组运算符

    您所描述的似乎是基于参数创建一个regexp。您可以通过将字符串传递给
    Regexp.new
    并使用结果来完成此操作

    例如:

    def match_for_options(options)
      pattern = '^'
    
      pattern << 'A' * options[:a] if (options[:a])
      pattern << 'B' * options[:b] if (options[:b])
      pattern << 'C' * options[:c] if (options[:c])
    
      Regexp.new(pattern)
    

    我认为我的日常表达很好,我想不出有什么办法去做你要做的事。正则表达式寻找模式,而您似乎想要的是许多不同的模式。在您的情况下,编写一个函数将字符串拆分为字符并计算您拥有的内容可能更合适,这样您就可以满足您的条件

    仅举一个问题的例子,类似regex的/[abc]/将匹配a、b和c的每一次出现,而不管这些字母在字符串中出现多少次。您可以尝试/c{1,2}/,它将匹配“c”、“cc”和“ccc”。它与上一个案例相匹配,因为在“ccc”中有一个1 c和2 c的模式

    在开发和调试正则表达式时,我发现一件非常宝贵的事情是。尝试一些例子,我想你会看到你面对的是什么


    我不知道这是否真的有帮助,但它可能有助于你选择一个方向。

    我认为我自己对正则表达式很好,我想不出一个方法来做你要问的。正则表达式寻找模式,而您似乎想要的是许多不同的模式。在您的情况下,编写一个函数将字符串拆分为字符并计算您拥有的内容可能更合适,这样您就可以满足您的条件

    仅举一个问题的例子,类似regex的/[abc]/将匹配a、b和c的每一次出现,而不管这些字母在字符串中出现多少次。您可以尝试/c{1,2}/,它将匹配“c”、“cc”和“ccc”。它与上一个案例相匹配,因为在“ccc”中有一个1 c和2 c的模式

    在开发和调试正则表达式时,我发现一件非常宝贵的事情是。尝试一些例子,我想你会看到你面对的是什么


    我不知道这是否真的有帮助,但它可能会帮助您选择一个方向。

    因为您希望允许这些“元素”以任何顺序出现,所以最好编写一段Ruby代码,从头到尾遍历字符串并计算As、Bs和Cs的数量,查找它是否包含所需的子字符串。如果As、Bs和Cs的数量在所需的限制范围内,并且它包含所需的子字符串,并且其长度(即字符数)等于所需子字符串的长度,加上As的#,加上Bs的#,加上Cs的#,再加上最多N个字符,则该字符串是好的,否则它是坏的。实际上,要小心,您应该首先搜索所需的子字符串,然后将其从原始字符串中删除,然后计算As、Bs和Cs,否则您可能会无意中计算所需字符串中出现的As、Bs和Cs(如果有)


    你可以用正则表达式做你想做的事情,但它会是一个很长很难看的正则表达式。为什么?因为对于元素的每个可能顺序,正则表达式中都需要单独的“case”。例如,正则表达式“^ abc…XY$”将匹配以“abc”开头的任何字符串,以“XY”结尾,中间有两个通配符。但只有按这个顺序。如果您想为所有可能的顺序使用正则表达式,则需要在正则表达式中列出所有这些顺序,例如,它的开头类似“^(ABC..XY | ACB..XY | BAC..XY | BCA..XY |”从这里开始,对于5个元素的列表,大约有5!=120个不同的顺序,然后在没有A的情况下需要更多的顺序,在没有B的情况下需要更多的顺序,等等。我认为正则表达式对于这里的工作来说是错误的工具。

    因为你想允许这些“元素”要以任何顺序出现,最好编写一段Ruby代码,从头到尾遍历字符串,计算As、Bs和Cs的数量,确定它是否包含所需的子字符串。如果As、Bs和Cs的数量在所需限制内,并且它包含所需的子字符串及其长度(即字符数)相等
    if subject =~ 
        /^                          # start of string
        (?!(?:[^A]*A){2})           # assert that there are less than two As
        (?!(?:[^B]*B){2})           # and less than two Bs
        (?!(?:[^C]*C){3})           # and less than three Cs
        (?!(?:[ABCXY]*[^ABCXY]){3}) # and less than three non-ABCXY characters
        (?=.*XY)                    # and that XY is contained in the string.
        /x
    
        # Successful match
    else
        # Match attempt failed
    end