繁体   English   中英

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

[英]java regular expression extract numbers from strings with two variance

我需要编写一个从字符串中提取股票代码的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]*(?=\\))");

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

您可以使用

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

正则表达式演示

细节

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

Java演示

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

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

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

说明:

  • \\( -匹配(从字面上看。
  • (...) -捕获其中的任何内容
  • [^)]* -匹配所有直到a ) 这样可以确保在括号中您要捕获的消息结束时停止捕获。
  • \\) -匹配)从字面上看

正则表达式演示

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM