如何使用正则表达式验证 ISIN?
在本题中,我们将使用正则表达式在 C++ 中验证 ISIN 号码。
ISIN 代表国际证券识别号码 (International Securities Identification Number)。它是用于识别股票、金融债券等的唯一代码。ISIN 号码的长度可以是 12 位或 14 位,这确保了特定商品的国际识别。
让我们了解一下 ISIN 号码的格式。
国家代码 − 以国家代码的两个字符开头。
标识符 − 国家代码后包含 9 个字母数字字符。
校验和 − 包含用于检测 ISIN 号码中错误的一位数字。
国家代码和标识符后可能包含连字符 (-)。
问题描述 − 我们给出了字符串格式的 ISIN 号码。我们需要使用正则表达式验证 ISIN 号码。
示例
输入
str1 = "SB0123456A98"
输出
Yes
说明
该 ISIN 号码有效,因为它符合 ISIN 代码的所有规则。
输入
str1 = "US-01207199D-8"
输出
Yes
解释
这是一个有效的 ISIN 号码。
输入
str1 = "USerw01207199D8"
输出
No
解释
标识符的长度为 12。因此,这是一个无效的 ISIN号码。
用户可以使用以下正则表达式来验证 ISIN 号码。
^[A-Z]{2}[-]{0,1}[A-Z0-9]{9}[-]{0,1}[0-9]{1}$
^ − 正则表达式的开头。
[A-Z]{2} − 两个字符的国家代码。
[-]{0,1} − 可以包含连字符 (-)。
[A-Z0-9]{9} − 长度为 9 的标识符,包含从 A 到 Z 和 0 到 9 的字符。
[0-9]{1} − 一个校验和数字
$ − 正则表达式结束。
方法 1
在此方法中,我们将使用 C++ 的"regex"库从字符串创建正则表达式模式,并使用 regex_match() 方法来验证 ISIN 号码。
算法
步骤 1 − 如上所述,定义名为"isinPat"的正则表达式。
步骤 2 − 如果字符串为空,则打印"无效字符串"。
步骤 3 − 将 ISIN 号码字符串作为第一个参数,将搜索模式作为第二个参数传递后,执行 regex_match() 方法。
步骤 4 − 如果 ISIN 字符串有效,则打印"Yes"。否则,打印"No"。
示例
#include <bits/stdc++.h> #include <regex> using namespace std; void ISINValidation(string isinStr) { // 定义 isinStr 的正则表达式模式 const regex isinPat("^[A-Z]{2}[-]{0,1}[A-Z0-9]{9}[-]{0,1}[0-9]{1}$"); // 对于空字符串 if (isinStr.empty()) { cout << "The ISIN string is empty\n"; } // 使用正则表达式匹配字符串 if (regex_match(isinStr, isinPat)) { cout << "The ISIN string " << isinStr << " is valid\n"; } else { cout << "The ISIN string " << isinStr << " is invalid\n"; } } int main() { string str1 = "SB0123456A98"; ISINValidation(str1); string str2 = "US-01207199D-8"; ISINValidation(str2); return 0; }
输出
The ISIN string SB0123456A98 is valid The ISIN string US-01207199D-8 is valid
时间复杂度 – O(N),与 regex_match() 方法的时间复杂度相同。
空间复杂度 – O(1)
方法 2
此方法使用 regex_search() 方法验证 ISIN 号码。当 regex_search() 方法在字符串中找到第一个与模式匹配的字符串时,它会返回 true。
算法
步骤 1 - 如果字符串为空,则返回 false。
步骤 2 - 使用 regex_search() 方法验证 ISIN 字符串。
步骤 3 - 如果 ISIN 字符串有效,则函数返回 true。否则,返回 false。
示例
#include <bits/stdc++.h> #include <regex> using namespace std; bool ISINValidation(string isinStr) { // 定义 isinStr 的正则表达式模式 const regex isinPat("^[A-Z]{2}[-]{0,1}[A-Z0-9]{9}[-]{0,1>\\d$"); // 空字符串 if (isinStr == "") { return false; } // 使用正则表达式匹配字符串 if (regex_search(isinStr, isinPat)) { return false; } else { return true; } } int main() { string str1 = "SB0123456A98"; if (ISINValidation(str1)) { cout << "The ISIN number " << str1 << " is valid" << endl; } else { cout << "The ISIN number " << str1 << " is not valid" << endl; } return 0; }
输出
The ISIN number SB0123456A98 is not valid
时间复杂度 – 在字符串中搜索模式的复杂度为 O(N)。
空间复杂度 – O(1)
regex_match() 将完整字符串与模式匹配,而 regex_search() 则在部分匹配的情况下返回 true。因此,在某些情况下,regex_search() 方法可能会给出错误的输出。