彭博期货的股票代码通常如下:
MCDZ3 Curcny
根目录为MCD
,月份字母和年份为Z3
,“黄色键”为Curcny
。
请注意, root 可以是可变长度,2-4个字母或1个字母和1个空格(例如S H4 Comdty
)。
信函年仅允许expr
中下面列出的字母,并且可以有两位数的年份。
最后,黄色键可以是多个安全类型字符串之一,但我只对(Curncy|Equity|Index|Comdty)
感兴趣。
在 Matlab 中,我有以下正则表达式
expr = '[FGHJKMNQUVXZ]\d{1,2} ';
[rootyk, monthyear] = regexpi(bbergtickers, expr,'split','match','once');
其中
rootyk{:}
ans =
'mcd' 'curncy'
和
monthyear =
'z3 '
我不想在月中匹配''(空格)。我该怎么办?
答案 0 :(得分:2)
假设根目录中没有前导空格或尾随空格,只有大写字母,这应该有效:
^([A-Z]{2,4}|[A-Z]\s)([FGHJKMNQUVXZ]\d{1,2}) (Curncy|Equity|Index|Comdty)$
你已经在第一组获得了根,第二组是第二年,第三组是黄键。
我不知道Matlab,也不知道它是否涵盖了Perl Compatible Regex。如果失败,请尝试例如使用代替
\s
。另外,如果您想从更大的源文本中提取,请删除^...$
。
答案 1 :(得分:2)
您正在为regexpi
提供的表达式包含空格,并用作'match'
的模式。这就是匹配的monthyear
字符串也有空格 1 。
如果你想保持简单并让regexpi
为你工作(而不是后处理它的输出),尝试一种不同的方法并捕获令牌而不是匹配,并忽略中间空间:
%// <$1><----------$2---------> <$3>
expr = '(.+)([FGHJKMNQUVXZ]\d{1,2}) (.+)';
tickinfo = regexpi(bbergtickers, expr, 'tokens', 'once');
如果愿意,您还可以将表达式简化为更基因的'(.+)(\w{1}\d{1,2})\s+(.+)'
。
bbergtickers = 'MCDZ3 Curncy';
expr = '(.+)([FGHJKMNQUVXZ]\d{1,2})\s+(.+)';
tickinfo = regexpi(bbergtickers, expr, 'tokens', 'once');
结果是:
tickinfo =
'MCD'
'Z3'
'Curncy'
1 此表达式也用作'split'
的分隔符。从中删除尾随空格无济于事,因为它将重新出现在rootyk
输出中。
答案 2 :(得分:0)
假设您只想摆脱边缘处的前导或尾随空格,有一个非常简单的命令:
monthyear = trim(monthyear)
要删除所有空格,您可以执行以下操作:
monthyear(isspace(monthyear))=[]
答案 3 :(得分:0)
这是一种完全不同的方法,基本上会在您的年份编号之前搜索字母:
s = 'MCDZ3 Curcny'
p = regexp(s,'\d')
s(min(p)
s(min(p)-1:max(p))