我需要编写一个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]*(?=\\))");
但是不知道如何为第二个方差编写模式。如果可能的话,我宁愿对两者都使用单一模式。我将不胜感激。预先谢谢你。
答案 0 :(得分:2)
您可以使用
(?:\G(?!^)|\(stock)[^()\d]*(\d+)(?=[^()]*\))
请参见regex demo
详细信息
(?:\G(?!^)|\(stock)
-上一场比赛的结束或(stock
[^()\d]*
-除(
,)
和数字之外的0个或多个字符(\d+)
-第1组:一个或多个数字(也使用\d+(?:\.\d+)?
来匹配浮点值)(?=[^()]*\))
-一个正向超前查询,需要除(
和)
之外的任何0+个字符,然后紧接当前位置右侧的)
。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("\(([^)]*)\)");
说明:
\(
-从字面上匹配(
。(...)
-捕获其中的任何内容[^)]*
-与所有内容匹配,直到)
。这将确保
当您尝试在邮件中捕获邮件时,捕获将停止
括号结束。\)
-完全匹配)
此正则表达式的意思是“匹配一个具有开头然后是右括号的字符串,然后捕获那些括号中的内容”,这样它就适用于两种模式。只要您的消息始终包含一组括号,考虑到其速度和简便性,这将是您的最佳选择。
这将与字符串匹配,并且仅捕获给定消息中括号中的内容,例如第二个字符串中的“股票代码:USD计数器:3199,EUR计数器:83199和SWF计数器:9999”。