2 回答

TA貢獻1863條經驗 獲得超2個贊
你可以使用
(?:\G(?!^)|\(stock)[^()\d]*(\d+)(?=[^()]*\))
請參閱正則表達式演示
細節(jié)
(?:\G(?!^)|\(stock)
- 上一場比賽結束或(stock
[^()\d]*
(
- 除了,)
和數(shù)字之外的任何 0 個或多個字符(\d+)
- 第 1 組:一個或多個數(shù)字(\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

TA貢獻1830條經驗 獲得超3個贊
如果您的字符串大部分相同且不會更改,請使用此
Pattern.compile("\(([^)]*)\)");
解釋:
\(
- 逐字匹配(
。(...)
- 捕獲其中的任何內容[^)]*
- 匹配直到)
. 這將確保當您嘗試在括號中捕獲的消息結束時捕獲停止。\)
- 逐字)
匹配
這個正則表達式的意思是“匹配一個有左括號和右括號的字符串,然后捕獲括號中的任何內容”,因此它適用于這兩種模式。只要您的消息始終包含一組括號,考慮到它的速度和簡單性,這將是您的最佳選擇。
這將與字符串匹配,并且只捕獲給定消息中括號中的內容,例如第二個字符串中的“股票代碼:美元柜臺:3199,歐元柜臺:83199 和 SWF 柜臺:9199”。
添加回答
舉報