我正在尝试匹配CUSIP号码。我有以下内容,但它缺少一些边缘情况。
\s[A-Za-z0-9]{9}\s
我需要省略在中间包含空格的字符串,我需要它来匹配可能与其他文本接壤的字符串。我的字符串通常被制表符包围,但它可能只有一个空格字符将CUSIP与其他文本分开。在此先感谢,我对正则表达式非常环保。附:我在.NET工作
实施例
“[TAB] 123456789 [TAB]”应匹配(我现在就知道了)
“sometext [TAB] 123456789 [TAB] sometext”应匹配(目前尚未返回)
不应该返回“某些文字”(我目前正在进行这种匹配)答案 0 :(得分:5)
根据this page,,不只是任何9位数的字母数字都是有效的CUSIP。前三个字符只能是数字,第九个是校验和所以如果你想区分CUSIP和其他9个字符的字符串,我相信这应该更好:
\s[0-9]{3}[a-zA-Z0-9]{6}\s
或者,如果您还想匹配以输入的开头或结尾为界的字符串:
(^|\s)[0-9]{3}[a-zA-Z0-9]{6}(\s|$)
或者,如果您还想匹配标点符号边界的字符串(例如“(100ABCDEF)”:
(^|[^a-zA-Z0-9])[0-9]{3}[a-zA-Z0-9]{6}([^a-zA-Z0-9]|$)
我认为这应该是一个99%的解决方案,但是如果你想要非常强大,你可能还想研究使用第9个(奇偶校验)字符来验证字符串是否有效。
答案 1 :(得分:4)
其他答案是错误的,没有考虑PPN并允许检查数字是一封信。因此,这是一个更好的解决方案。
基于this document和this document,CUSIP具有以下规则:
考虑到这一点,以下正则表达式应该提供紧密匹配:
^[0-9]{3}[a-zA-Z0-9]{2}[a-zA-Z0-9*@#]{3}[0-9]$
你可以玩它here。
请注意,尽管没有深入细节,但这会使表达变成怪物,这是尽可能紧的。我建议你使用校验位算法来完全验证CUSIP,你可以找到here。
答案 2 :(得分:2)
string haystack = "some 123456789 text";//single space separators
string haystack2 = "some\t123456789\ttext";//tab separators
// The comment is correct, your pattern was correct originally.
// This is just slightly dressed up.
string pattern = @"(\s+)(?<cusip>[A-Za-z0-9]{9})(\s+)";
Match m = Regex.Match(haystack, pattern);
Console.WriteLine("Match for cusip surrounded by spaces:" + m.Groups["cusip"]);
//Output: Match for cusip surrounded by spaces:123456789
Match m2 = Regex.Match(haystack2, pattern);
Console.WriteLine("Match for cusip surrounded by tabs:" + m2.Groups["cusip"]);
//Output: Match for cusip surrounded by tabs:123456789
答案 3 :(得分:0)
public Boolean CusipValidation(string sCusip)
{
string Cusippattern = @"^([0-9]){3}([a-zA-Z0-9]){6}$";
if (!System.Text.RegularExpressions.Regex.IsMatch(sCusip, Cusippattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase) && sCusip != string.Empty)
return false;
else
return true;
}