Ruby 正则表达式来匹配我的单词模式,wild chars
你能帮我吗 我希望我的Ruby程序有一个正则表达式来匹配下面模式的单词 图案有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的词 我使用的模式类似于^[
但它会查找超过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