This is the spec(用于FATCA GIIN)。
4个组中的19位数字(只有字母数字和大写字母),每个数字由一个强制点/句点分隔:
XXXXXX.XXXXX.XX.XXX
前两组是字母数字大写字母,但绝不包含大写字母O。
第三组似乎只允许2个大写字母的严格组合:
LE|SL|ME|BR|SP
第四组只有数字。
到目前为止,我已经掌握了这一点,但是在如何添加“禁止允许O”规则方面仍然存在:
[A-Z0-9]){6}\.[A-Z0-9]){5}\.(LE|SL|ME|BR|SP)\.\d{3}
那么如何限制前两个组现在允许O?
注意-这是 Ruby
答案 0 :(得分:1)
您可以使用character class intersection和-匹配整个字符串-锚点:
/\A[A-Z0-9&&[^O]]{6}\.[A-Z0-9&&[^O]]{5}\.(?:LE|SL|ME|BR|SP)\.\d{3}\z/
要匹配整个单词,请仅使用单词边界\b
,而不要使用锚点:
/\b[A-Z0-9&&[^O]]{6}\.[A-Z0-9&&[^O]]{5}\.(?:LE|SL|ME|BR|SP)\.\d{3}\b/
请参见Rubular demo。
详细信息
\A
-字符串的开头[A-Z0-9&&[^O]]{6}
-6个大写字母或数字,但不包含O
\.
-点[A-Z0-9&&[^O]]{5}
-5个大写字母或数字,但不包含O
\.
-点(?:LE|SL|ME|BR|SP)
-LE
,SL
,ME
,BR
或SP
\.
-点\d{3}
-任何三位数\z
-字符串结尾答案 1 :(得分:1)
当前模式的格式不正确,有未封闭的组。
要省略O
,可以使用[A-NP-Z]
如果不需要组,可以使用:
\b[A-NP-Z0-9]{6}\.[A-NP-Z0-9]{5}\.(?:LE|SL|ME|BR|SP)\.\d{3}\b
说明
\b
字边界[A-NP-Z0-9]{6}
在没有O的情况下按A-Z匹配6次\.
匹配.
[A-NP-Z0-9]{5}
在没有O的情况下匹配5次A-Z0-9 \.
匹配.
(?:LE|SL|ME|BR|SP)
匹配任何列表项\.
匹配.
\d{3}
匹配3位数字\b
匹配单词边界您可以在模式周围添加单词边界\b
,以防止开头和结尾成为较大单词的一部分。或者,您可以添加\A
和\z
锚以匹配字符串的开头和结尾。
答案 2 :(得分:0)
事实证明,我需要进行负面否定的预测:
(?:(?![O])
基本上说“除了O”(在后面的组中,因此是“向前看”)。
所以最终的解决方案是这样(我认为,虽然不确定,但似乎可行):
(?:(?![O])[A-Z0-9]){6}\.(?:(?![O])[A-Z0-9]){5}\.(?:LE|SL|ME|BR|SP)\.\d{3}