我正在尝试匹配CUSIP号码.我有以下内容,但它缺少一些边缘情况.
\s[A-Za-z0-9]{9}\s
Run Code Online (Sandbox Code Playgroud)
我需要省略在中间包含空格的字符串,我需要它来匹配可能与其他文本接壤的字符串.我的字符串通常被制表符包围,但它可能只有一个空格字符将CUSIP与其他文本分开.在此先感谢,我对正则表达式非常环保.PS我在.NET工作
例
"[TAB] 123456789 [TAB]"应匹配(我现在收到此信息)
"sometext [TAB] 123456789 [TAB] sometext"应匹配(目前尚未返回)
不应该退回"一些文字"(我目前正在进行这种匹配)
根据此页面,不只是任何9位字母数字都是有效的CUSIP.前三个字符只能是数字,第九个是校验和所以如果你想区分CUSIP和其他9个字符的字符串,我相信这应该更好:
\s[0-9]{3}[a-zA-Z0-9]{6}\s
Run Code Online (Sandbox Code Playgroud)
或者,如果您还想匹配以输入的开头或结尾为界的字符串:
(^|\s)[0-9]{3}[a-zA-Z0-9]{6}(\s|$)
Run Code Online (Sandbox Code Playgroud)
或者,如果您还想匹配以标点符号为边界的字符串(例如"(100ABCDEF)"):
(^|[^a-zA-Z0-9])[0-9]{3}[a-zA-Z0-9]{6}([^a-zA-Z0-9]|$)
Run Code Online (Sandbox Code Playgroud)
我认为这应该是一个99%的解决方案,但如果你想要非常强大,你可能还想研究使用第9个(奇偶校验)字符来验证字符串是否有效.
其他答案是错误的,没有考虑 PPN 并允许校验位是一个字母。因此,这里有一个更好的解决方案。
考虑到这一点,以下正则表达式应提供紧密匹配:
^[0-9]{3}[a-zA-Z0-9]{2}[a-zA-Z0-9*@#]{3}[0-9]$
Run Code Online (Sandbox Code Playgroud)
你可以在这里玩它。
请注意,这是尽可能紧凑的,不要深入研究太多细节,这会使表达式变成一个怪物。我建议您使用校验位算法来完全验证 CUSIP,您可以在此处找到。