BIC 检查的正则表达式

Posted

技术标签:

【中文标题】BIC 检查的正则表达式【英文标题】:Regex for BIC check 【发布时间】:2013-04-01 22:47:29 【问题描述】:

我为 php 函数 pregmatch 写了一个正则表达式,如下所示:

^([a-zA-Z])4([a-zA-Z])2([0-9a-zA-Z])2([0-9a-zA-Z]3)?$^

现在我需要检查 BIC 字符串的一致性。

它有问题……它总是正确的。我不知道为什么。

我使用的代码是这样的:

/**
 * Checks the correct format from the 
 * @param string $bic
 * @return boolean
 */
public function checkBic($bic)

    $bic = $this->cleanFromSeparators($bic);
    if (preg_match($this->getBicCompare(), $bic)) 
        return true;
     else 
        return false;
    


private function getBicCompare()

    return "^([a-zA-Z])4([a-zA-Z])2([0-9a-zA-Z])2([0-9a-zA-Z]3)?$^";

编辑:

以下是来自 swift 帐户的 BIC 格式参考:

http://www.sage.co.uk/sage1000v2_1/form_help/workingw/subfiles/iban_and_bic.htm

http://en.wikipedia.org/wiki/ISO_9362

http://www.swift.com/products_services/bic_and_iban_format_registration_bic_details?rdct=t

一个示例 BIC 将是:

NOLADE21STS

OPSKATWW

仅当字符串包含以下代码时,正则表达式才应返回 true: 它的长度为 8 个或 11 个字符,包括:

银行代码 - 4 个字母字符 国家代码 - 2 个字母 位置代码 - 2 个字母数字字符,零除外 分行代码 - 3 个字母数字字符

这些是规格。

所以长度可以是 11 或 8,前 4 可以是任何东西,然后 2 个字母是必须的,然后是 2 个数字和可选的 3 个字母数字。

以下内容无效:

abcdefxx

abcdefxxyyy

这些也是无效的:

aaaa11xx

aaaa11xxyyy

等等。

【问题讨论】:

您能提供更多信息吗?例如,正确的 BIC 应该和不应该看起来如何...... 愿意 :) 一会儿 @Sangoku 你能给我们举个例子,说明什么不应该起作用,但做了吗? 【参考方案1】:

我不建议使用它,因为它缺乏性能,但如果有人需要根据ISO-3366-1 国家代码验证 IBANS:

/^[A-Z]4(AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BQ|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CE|CF|CG|CH|CI|CK|CL|CM|CN|CO|CP|CR|CS|CU|CV|CW|CX|CY|CZ|DD|DE|DG|DJ|DK|DM|DO|DZ|EA|EC|EE|EG|EH|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|FX|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|IC|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NT|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SF|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TA|TC|TD|TF|TG|TH|TJ|TK|TL |TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XK|YE|YT|ZA|ZM|ZR|ZW)[2-9A-Z][0-9A-NP-Z](XXX|[0-9A-WYZ][0-9A-Z]2)?$/i

这也是内容验证,而不仅仅是格式验证。 但它会为你节省一些代码:)

【讨论】:

你在回答什么问题?【参考方案2】:
echo preg_match('/^[A-Z]4(AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BQ|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CE|CF|CG|CH|CI|CK|CL|CM|CN|CO|CP|CR|CS|CU|CV|CW|CX|CY|CZ|DD|DE|DG|DJ|DK|DM|DO|DZ|EA|EC|EE|EG|EH|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|FX|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|IC|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NT|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SF|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TA|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XK|YE|YT|ZA|ZM|ZR|ZW)[2-9A-Z][0-9A-NP-Z]([A-Z0-9]3|x3)?$/',$val);

【讨论】:

这个纯代码答案的解释在哪里?与此页面上已有的答案相比,这个答案在哪些方面更好/更有价值?为什么要使用这种很长的模式? 每个答案都应该包含简单的英文解释。这是我第二次告诉你这个。请编辑您的问题,以教育/授权 OP 和成千上万的未来研究人员。【参考方案3】:

这是用于验证 BIC 的官方 SEPA 模式

[A-Z]6,6[A-Z2-9][A-NP-Z0-9]([A-Z0-9]3,3)0,1

【讨论】:

你在哪里找到的? 例如匹配 SCHEDULEWebsense 这样的词,不推荐。即使效率低下,上面@serraine 的答案至少是准确的。【参考方案4】:

结构

最新版本是 ISO 9362:2009(日期为 2009-10-01)。 SWIFT 代码 是 8 或 11 个字符,由:

4 个字母:机构代码或银行代码。

2 个字母:ISO 3166-1 alpha-2 国家/地区代码

2 个字母或数字:位置代码

如果第二个字符是“0”,那么它通常是一个测试 BIC 反对在实时网络上使用的 BIC。如果第二个字符是 “1”,则表示 SWIFT 网络中的被动参与者,如果 第二个字符是“2”,那么它通常表示反向计费 BIC,收件人为消息付费,而不是更多 发送者为消息付费的通常模式。

3 个字母或数字:分支代码,可选('XXX' 代表主要 办公室)

(http://en.wikipedia.org/wiki/ISO_9362)

(德语-Wiki中的不同定义http://de.wikipedia.org/wiki/ISO_9362)

2 个字母或数字:位置代码 第一个字符不能是数字“0”或“1”。 字母“O”不允许作为第二个字符。 (此定义的正则表达式:[2-9a-z][0-9a-np-z])

'/^[a-z]6[2-9a-z][0-9a-np-z]([a-z0-9]3|x3)?$/i'

【讨论】:

添加正则表达式的各个部分如何与规范相关的细分会很有用。 德语***还说可选的分支名称不能以“X”开头,除非它是 XXX。那么正则表达式将是'/^[A-Z]6[2-9A-Z][0-9A-NP-Z](XXX|[0-9A-WYZ][0-9A-Z]2)?$/i'【参考方案5】:

好的。对于所有对此类问题有相同问题的人,正确的正则表达式是:

/^[0-9a-z]4[a-z]2[0-9a-z]2([0-9a-z]3)?\z/i

你的@Qtax 提供它。我只是稍微改进了一下。

编辑调整是我改变了它,所以前 4 个字母可以是字母数字,但它后面的 2 个字母必须代表一个国家的国际代码。这就是为什么只有字母。我与具有实际使用代码的实际用户进行了检查。它们可以在前 4 个位置具有数值。

编辑:

我错了。前 4 个不能只有字母。我正在转达 Reifeisen Bank 的一名员工的一份声明,当时我正在讨论该标准。原来他在想银行内部的号码,不知道什么系统不能是有效的代码。事实证明并非如此。

所以正确的语法是

/^6[a-z]2[0-9a-z]2([0-9a-z]3)?\z/i

将标记正确答案。谢谢你指出。

【讨论】:

为什么前4个字符要加数字?这不在您的问题中,也不在链接的规范中。 那是国家代码和数字。相信我这个没问题:) 对于所有使用负 4 个字母评分的人可以包含某些国家/地区的数字,但它的末尾必须有 2 个数字,否则银行的支票将失败。在此电话之后,我直接调用了银行 api。 Sangoki 的最后一个正则表达式正确。 BIC 的前四个字符必须是字母而不是数字。我认为正确的是: /^[az]4[az]2[0-9a-z]2([0-9a-z]3)?\z/i 或- 使其更短 /^[az]6[0-9a-z]2([0-9a-z]3)?\z/i【参考方案6】:

我认为这个可以:

/^[a-z0-9]4[a-z]2\d2([a-z0-9]3)?$/

即:

    字符串开始,^ 四个字母数字字符,[a-z0-9]4 两个数字,\d2 三个可选(?后缀)字母数字字符,([a-z0-9]3)? 字符串结束,$

您可以看到它并对其进行测试here(我使用了您的示例)。 无论如何,根据您报告的规则,OPSKATWW 不应该是有效的 BIC,因为它在前 6 个字母之后没有数字。

【讨论】:

我需要 z/i 以确保它不区分大小写。 \d2 部分很好。会注意到它。 /d 十进制。不错。 对不起,我的意思是/^[a-z0-9]4[a-z]2\d2([a-z0-9]3)?$/iz 是干什么用的?无论如何,您也可以在针对此正则表达式进行测试之前执行$bic=strtolower($bic)【参考方案7】:

您使用^ 作为分隔符?你可能想要更多类似的东西:

'/^[a-z]6[0-9a-z]2([0-9a-z]3)?\z/i'

【讨论】:

"使用 PCRE 函数时,要求模式用分隔符括起来。分隔符可以是任何非字母数字、非反斜杠、非空白字符。”Source。使用^ 作为分隔符应该没有问题。 @Loamhoof,这是个问题,因为他想锚定表达式。这就是为什么我猜^ 被用作第一个字符。 说实话....这只是巧合...我以 ^()^ piggy :) 开始了正则表达式 :) @Qtax 肯定他想这样做,但是如果没有一个匹配的例子,而它不应该匹配,我们不能确定这是真正的问题。 (我猜^^ 应该可以工作,但仍然很丑。) PHP sn-p $result_bic = (bool) ( preg_match('/^[a-z]6[0-9a-z]2([0-9a-z]3)?\z/i', $bic) == 1 );

以上是关于BIC 检查的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java中检查姓名的正则表达式

正则表达式及linux文本检查工具

正则表达式检查重复

检查字符串是不是以正则表达式数字开头

正则表达式检查字符串是不是只有空格

在 C++ 中使用正则表达式检查字符串