3

我正在尝试从可能的代码列表中过滤掉公司代码。

以下代码是我到目前为止所得到的,我需要使 RegExp 足够复杂,以便仅通过某些模式。有关更具体的详细信息,请参见下面的示例代码。

Pattern tickerPattern = Pattern.compile("^[A-Z:\\.0-9]+$");

String[] tickerStrArr={
                    "JELK90#$",  // NOT A TICKER
                    "1",         // NOT A TICKER
                    "0",         // NOT A TICKER
                    "R",         // NOT A TICKER
                    "25.36",     // NOT A TICKER
                    "1.0",       // NOT A TICKER
                    "GOOG",      // Ticker
                    "NYSE:C",    // Ticker (with exchange code NYSE)
                    "GOOG.BY",   // Ticker (with exchange code BY)
                    "$90",       // NOT A TICKER
                    "98774",     // Ticker (because more than 4 digit long)
                    "789.BY"     // Ticker (because ends with .[A-Z]{2,2})
                   };

for(String tickerStr: tickerStrArr)
{
    Matcher matcher =tickerPattern.matcher(tickerStr);

    if(matcher.find())
    {
        System.out.println("It's a ticker=>"+matcher.group());
    }
}

预期产出

It's a ticker=>GOOG
It's a ticker=>NYSE:C
It's a ticker=>GOOG.BY
It's a ticker=>98774
It's a ticker=>789.BY

你能制定出所需的 RegExp 来获得上述预期的输出吗?

以下是我自己过滤的规则(不一定适用于所有人)

  1. 只有字符或数字可以是股票代码的一部分,没有特殊的字符或货币符号。

  2. 有时会提到代码及其交换代码作为前缀 例如 => NYSE:C 或者可能有两个字符交换代码作为后缀 例如 => C.BY

  3. 如果都是数字,那么它应该超过 4 位数字。(这是为了排除数百万个误报)

  4. 但是,如果数字与交换代码一起被提及,则股票代码可能少于 4 位。因为,那我们有很高的信心。

如果您需要更多详细信息,请告诉我。

4

1 回答 1

6

以下正则表达式将匹配以下内容。

  • 字符串的开始
  • PreXChangeCode:可选地匹配 az,2 到 4 次,除非.以后有某个地方。这是为了检测具有多个交换符号的无效符号
  • 股票:az 1 到 4 次或数字 1-3 次,后跟句点或数字 4 次或更多次
  • PostXChangeCode : 可选地匹配 a .follow by az 2 次。
  • 字符串结束

正则表达式

 ^
 (?<PreXChangeCode>[a-z]{2,4}:(?![a-z\d]+\.))?
 (?<Stock>[a-z]{1,4}|\d{1,3}(?=\.)|\d{4,})
 (?<PostXChangeCode>\.[a-z]{2})?
 $

雷伊

我用REY对其进行了测试,它与您的测试数据正确匹配,但R. 我包括一个字符的股票名称,因为它们是有效的(R 是 Ryder Systems)。

于 2013-09-06T00:48:38.870 回答