【问题标题】:Regex to detect preferred stock symbols正则表达式检测优先股符号
【发布时间】:2021-03-04 18:52:42
【问题描述】:

首先,正则表达式可能是我编程领域最缺乏天赋的方面,这就是我目前所拥有的:
\D{1,5}(PR)\D+$

\D{1,5} 因为普通股票代码总是最多 5 个字母
(PR) 因为这是需要搜索的模式的一部分(更多信息在后台信息中)
\D+$ 因为我正在尝试匹配字符串末尾的任何单个字母

一点背景知识
首选股票代码没有标准化,因此每个平台、交易所等都有自己的显示方式。话虽如此,大多数人的名字中都会显示一个特殊字符,这使得这些人很容易被发现。字符是
[] {'.', '/', '-', ' ', '+'};
比较棘手的都有类似的模式:
{symbol}PR{0}
{symbol}p{0}
{符号}P{0}
其中0 是任意单个字母 A-Z

这里是复杂数据集的示例数据集:

PSAPRZ
PSApA
PSApZ
PSAPA
PSAPZ

我的正则表达式似乎适用于第一个,因为我专门寻找 (PR) 并匹配最后的任何单个字母字符,但我无法终生弄清楚如何检测在同一正则表达式中以p{0}P{0} 结尾的模式。我完全放弃了寻找特殊符号的尝试,因为我可以轻松地在目标字符串上为任何这些字符执行 string.Contains。更重要的部分是找出这些更棘手的部分。

如何让我的正则表达式语句同时检测同一正则表达式语句中的 p{0} 和 P{0} 匹配项?

编辑 1 如果您对不同可能性的疯狂感到好奇,包括“易于检测”的版本,请拿一个爆米花,给您:)

PSA.PA
PSA.PR.A
PSA/PA
PSAPRA
PSA-A
PSA PRA
PSA.PRA
PSA.PA
PSA+A
PSA/PRA
PSApA
PSAPA
PSA-PA

【问题讨论】:

    标签: regex


    【解决方案1】:

    应该这样做:

    ^[A-Z]{1,5}([Pp]|PR)[A-Z]$
    

    解释:

    • ^ - 开始锚定
    • [A-Z]{1,5} - 一到五个大写字母
    • ([Pp]|PR) - 捕获组用于:大写 P 或小写 p 或大写 PR
    • [A-Z] - 一个大写字母
    • $ - 锚点结束

    在有问题的 EDIT 1 之后更新。要支持 ./-+ 的奇数格式,请使用:

    ^[A-Z]{1,5}[.\/\s\+\-]?([Pp]|PR\.?)[A-Z]$
    

    解释:

    • ^ - 开始锚点
    • [A-Z]{1,5} - 一到五个大写字母
    • [.\/\s\+\-]? - 可选单个字符 ., /, , +, -
    • ([Pp]|PR\.?) - 捕获组用于:大写P,或小写p,或大写PR,后跟可选.
    • [A-Z] - 一个大写字母
    • $ - 锚点结束

    关于锚点的注意事项:如果字符串中只有股票代码,请使用 ^...$ 锚点。如果您在其中的任何地方都有带有股票代码的文本,请改用单词边界\b...\b

    了解更多关于正则表达式的信息:https://twiki.org/cgi-bin/view/Codev/TWikiPresentation2018x10x14Regex

    【讨论】:

    • 我最终在([Pp]|PR\.?) 之后添加了?,因为您给出的最终迭代没有捕获PSA-APSA+A
    • 嗯,实际上最后的更改使它将 BTCUSD 识别为有效的优先股,这是错误的,我现在已经转向 ^[A-Z]{1,5}[.\/\s\+\-]?([Pp]|PR\.?|[-]|[+])[A-Z]$
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多