正则表达式检测优先股票代码

时间:2021-03-04 18:52:42

标签: regex

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

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

背景的小花絮
优先股符号没有标准化,因此每个平台、交易所等都有自己的显示方式。话虽如此,大多数人在他们的名字中显示一个特殊字符,这使得这些人很容易被发现。字符是
[] {'.', '/', '-', ' ', '+'};
更棘手的都有类似的模式:
{symbol}公关{0}
{symbol}p{0}
{symbol}P{0}
其中 0 只是任意单个字母 A-Z

这里是一些比较棘手的样本数据集:

PSAPRZ
PSApA
PSApZ
PSAPA
PSAPZ

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

如何让我的 regex 语句也检测同一个 regex 语句中的 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

1 个答案:

答案 0 :(得分:3)

应该这样做:

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

说明:

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

在有问题的编辑 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