[英]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.