正则表达式使用JAVA检测公司代码

时间:2013-09-06 00:10:21

标签: regex

我试图从可能的代码清单中过滤掉公司代码。

以下代码是我到目前为止所做的,我需要使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位数。因为,那么我们有很高的信心。

  5. 如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:5)

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

  • 字符串的开头
  • PreXChangeCode :可选地匹配a-z,2到4次,除非稍后某处有.。这是为了检测具有多个交换符号的无效符号
  • 股票:a-z 1至4次或数字1-3次,后跟一段时间或数字4次或以上
  • PostXChangeCode :可选择将.跟随a-z正好匹配2次。
  • 字符串结尾

正则表达式

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

REY

我使用REY对其进行了测试,并且正确匹配了您的测试数据和R的例外情况。我包含了一个字符股票名称,因为它们是有效的(R是莱德系统)。