Java正则表达式从具有两个方差的字符串中提取数字

时间:2019-06-27 07:20:52

标签: java regex

我需要编写一个Java程序来从字符串中提取股票代码。字符串有两个变化,一个是

Market participants are requested to note that stock with code 83199 has single counter (stock code: 83199) trading in USD.

或这个:

Market participants are requested to note that stock with code 83199 has multiple counters (stock codes: USD counter: 3199, EUR counter: 83199 and SWF counter: 9199) trading in their corresponding currency.

我需要提取括号内的所有数字,而忽略括号外的数字。通过阅读这里类似问题的答案,我在这种模式的第一个变化中取得了一些成功:

Pattern.compile("(?<=stock\\s{1,2}code:\\s{1,2})[0-9]*(?=\\))");

但是不知道如何为第二个方差编写模式。如果可能的话,我宁愿对两者都使用单一模式。我将不胜感激。预先谢谢你。

2 个答案:

答案 0 :(得分:2)

您可以使用

(?:\G(?!^)|\(stock)[^()\d]*(\d+)(?=[^()]*\))

请参见regex demo

详细信息

  • (?:\G(?!^)|\(stock)-上一场比赛的结束或(stock
  • [^()\d]*-除()和数字之外的0个或多个字符
  • (\d+)-第1组:一个或多个数字(也使用\d+(?:\.\d+)?来匹配浮点值)
  • (?=[^()]*\))-一个正向超前查询,需要除()之外的任何0+个字符,然后紧接当前位置右侧的)

Java demo

String s = "Market participants are requested to note that stock with code 83199 has multiple counters (stock codes: USD counter: 3199, EUR counter: 83199 and SWF counter: 9199) trading in their corresponding currency.";
Pattern pattern = Pattern.compile("(?:\\G(?!^)|\\(stock)[^()\\d]*(\\d+)(?=[^()]*\\))");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 
// => 3199, 83199, 9199

答案 1 :(得分:0)

如果您的字符串基本相同并且不会改变,请使用此

Pattern.compile("\(([^)]*)\)");

说明:

  • \(-从字面上匹配(
  • (...)-捕获其中的任何内容
  • [^)]*-与所有内容匹配,直到)。这将确保 当您尝试在邮件中捕获邮件时,捕获将停止 括号结束。
  • \)-完全匹配)

Regex demo

此正则表达式的意思是“匹配一个具有开头然后是右括号的字符串,然后捕获那些括号中的内容”,这样它就适用于两种模式。只要您的消息始终包含一组括号,考虑到其速度和简便性,这将是您的最佳选择。

这将与字符串匹配,并且仅捕获给定消息中括号中的内容,例如第二个字符串中的“股票代码:USD计数器:3199,EUR计数器:83199和SWF计数器:9999”。