Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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
Parcelify(Shopify)的Ruby正则表达式_Ruby_Regex - Fatal编程技术网

Parcelify(Shopify)的Ruby正则表达式

Parcelify(Shopify)的Ruby正则表达式,ruby,regex,Ruby,Regex,我正在尝试用Ruby编写一个正则表达式,用于装运查询 如果邮政编码与MK1-MK10、MK19、MK43、MK46或MK77匹配,则允许它。 如果邮政编码与NN1-NN7、NN12、NN13、NN29或NN77匹配,则允许。 如果邮政编码与MK11-MK18匹配,则不允许 我的问题是,在英国,我们的邮政编码有点滑稽,你可以把MK11TS和MK11TS放在一起,它们被认为是一样的。如果不允许使用MK11,MK11TY可能会被误读为MK11 我已经在下面编写了一个正则表达式,到目前为止,它将不允许M

我正在尝试用Ruby编写一个正则表达式,用于装运查询

如果邮政编码与MK1-MK10、MK19、MK43、MK46或MK77匹配,则允许它。 如果邮政编码与NN1-NN7、NN12、NN13、NN29或NN77匹配,则允许。 如果邮政编码与MK11-MK18匹配,则不允许

我的问题是,在英国,我们的邮政编码有点滑稽,你可以把MK11TS和MK11TS放在一起,它们被认为是一样的。如果不允许使用MK11,MK11TY可能会被误读为MK11

我已经在下面编写了一个正则表达式,到目前为止,它将不允许MK111TS和MK11\s1TS,并允许MK1\s1TS但不允许MK11TS。任何帮助都将不胜感激,到目前为止我只对MK11进行了测试

^((?!MK11\d).)*$&^((?!MK11\s\d).)*$|(MK(1 |2 |3 |4 |5 |6 |7 |8 |9 |10 ))|(MK19)|(MK43)|(MK46)|(MK77)|(NN1)|(NN2)|(NN3)|(NN4)|(NN5)|(NN6)|(NN7)|(NN12)|(NN13)|(NN29)|(NN77)
提前谢谢

r = /
    (?:                                     # begin non-capture group           
      MK                                    # match characters
      (?:1|2|3|4|5|6|7|8|9|10|19|43|46|77)  # match one of the choices
      |                                     # or
      NN                                    # match characters
      (?:1|2|3|4|5|6|7|12|13|29|77)         # match one of the choices
    )                                       # end non-capture group
    (?![^\sA-Z])                            # do not match a space or cap letter
    /ix                                     # case indifferent and free-spacing
                                            # regex definition mode
这是按惯例写的

r = /(?:MK(?:1|2|...|10|19|...|77)|NN(?:1|2|...|7|12|13|29|77))(?![^\sA-Z])/i

"MK4 abc def MK11MK19ghi NN6 jkl NN13 NN29NN77".scan(r)
   # => ["MK4", "NN6", "NN13", "NN29", "NN77"]
“MK11”
不匹配,因为列表中没有
“11”
<代码>“MK19”不匹配,因为后面跟的字符既不是空格也不是大写字母

或者,你也可以写作

s = (['MK'].product(%w{1 2 3 4 5 6 7 8 9 10 19 43 46 77}).map(&:join) +
     ['NN'].product(%w{1 2 3 4 5 6 7 12 13 29 77}).map(&:join)).join('|')
  # => "MK1|MK2|...|MK10|MK19|MK43|MK46|MK77|NN1|NN2|...|NN7|NN12|NN13|NN29|NN77"
r = /(?:#{s})(?![^\sA-Z])/i
  #=> /(?:MK1|MK2|...|MK10|MK19|...|MK77|NN1|NN2|...|NN7|NN12|NN13|NN29|NN77)(?![^\sA-Z])/
如果剩余的邮政编码要包含在正则表达式中,也许可以执行以下操作

suffixes = %w|ES AB CD EF|.join('|')
  #=> "ES|AB|CD|EF"
然后用以下内容替换
(?![^\sA-Z])/x

\s?             # optionally match a space
(?:#{suffixes}) # match a valid suffix in a non-capture group
(?!\S)          # do not match a non-whitespace char (negative lookahead)
/ix             # case-indifferent and free-spacing regex definition mode

请注意,如果后缀位于字符串的末尾,则满足负前瞻性。

现在,我编写了以下内容,以便与邮政编码格式完全匹配:

#format: Area Code, Localities accepted, whitespace (MKor not), any digit, any single character, any single character
    ((MK|mk|Mk|mK)(?:1|2|3|4|5|6|7|8|9|10|19|43|46|77)\s\d[A-Za-z][A-Za-z]) #with whitespace
    |
    ((MK|mk|Mk|mK)(?:1|2|3|4|5|6|7|8|9|10|19|43|46|77)\d[A-Za-z][A-Za-z]) #without whitespace
    |
    ((NN|nn|Nn|nN)(?:1|2|3|4|5|6|7|12|13|29|77)\s\d[A-Za-z][A-Za-z]) #with whitespace
    |
    ((NN|nn|Nn|nN)(?:1|2|3|4|5|6|7|12|13|29|77)\d[A-Za-z][A-Za-z]) #without whitespace

这对我来说很有用,我是用卡里的答案来这里的,这非常有帮助。谢谢你和已经标记起来的。

带状空间,然后匹配。英国邮政编码的格式是什么?@sagarpanya82实际上包括了一个正则表达式定义,这是非常惊人的。实际上包括了一个正则表达式的定义,实际上包括了一个正则表达式的定义,这是非常惊人的:
([p>p>p>p>p>p>谢谢你和你和你和你和已经标记起来了。谢谢你和你和已经标记了。谢谢。谢谢你和有了。谢谢你和有了。谢谢你和已经标记了。谢谢。谢谢。谢谢。谢谢你和已经标记了。谢谢。谢谢。你和有。你和已经标记了。谢谢。谢谢。你和有了。你和有了。你和有了。你和已经标记了。谢谢。谢谢。谢谢。谢谢。你和有。你和有。你和有了。你和有了。你和有了。你和有标记了。你和有。你和有。有。有。你和有[0-9][A-Za-z]{2}$
谢谢,但没有回答我的问题。我只是尝试筛选某些邮政编码,没有找到如何编写所有邮政编码。在我的回答中,我假设“如果邮政编码与MK11-MK18匹配,则不允许。”可以替换为“如果邮政编码与这些不匹配,则不允许”这是一个合适的假设吗?我喜欢你在答案的顶部写正则表达式的方式,当我努力想把它弄对或者它是一个很长的正则表达式时,我会这样做。嗨,卡里,答案很好,很容易理解。但我的问题一定不是,因为这只是我试图达到的部分。正则表达式的标准格式英国邮编是(例如)MK131ES或MK131ES,无论中间是否有空白,都必须接受,上面写有2个字母(英国的捐助区),1个或2个数字(在该区域内捐赠地方),然后是1个数字和2个字母(在该地区捐献特定的一组房屋)。。我已经编辑过,也接受小写(以防万一),我已经编辑过我的问题,谢谢。@Roanforie,是的,自由间距模式使正则表达式定义可以自我记录,但是它的使用有一个潜在的“gotcha”:它去掉了空格。而
'catdog'[/td/]#=>'td'
'catdog'[/tg x]#=>nil
。这是因为后者相当于
'catdog'[/tg/]
。你需要使用
/t\sg/
/t[]g/
或不间断空格。谢谢Cary,这非常有用,我理解。我一定会记住这一点。我在回答的末尾添加了一些内容来解决你的问题。