Parcelify(Shopify)的Ruby正则表达式
我正在尝试用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进行了测试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
^((?!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,这非常有用,我理解。我一定会记住这一点。我在回答的末尾添加了一些内容来解决你的问题。