регулярное выражение Java извлекает числа из строк с двумя дисперсиями - PullRequest
1 голос
/ 27 июня 2019

Мне нужно написать 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 ]

2 голосов
/ 27 июня 2019

Вы можете использовать

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

См. Демоверсию regex

Детали

  • (?:\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
0 голосов
/ 27 июня 2019

Если ваши строки в основном одинаковы и не меняются, используйте эту

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

Пояснение:

  • \( - буквально соответствует (.
  • (...) - захватить все, что есть в этом
  • [^)]* - совпадать со всем до ). Это обеспечит захват останавливается, когда сообщение, которое вы пытаетесь захватить в конец скобок.
  • \) - соответствует ) буквально

Regex demo

Это регулярное выражение означает «сопоставить строку, в которой есть открывающие, затем закрывающие скобки, а затем захватить все, что находится в этих скобках», чтобы оно работало для обоих шаблонов. Пока ваше сообщение всегда содержит один набор скобок, это будет вашим лучшим вариантом, учитывая его скорость и простоту.

Это будет совпадать со строкой и захватывать только то, что в скобках в данном сообщении, например, "коды акций: счетчик USD: 3199, счетчик EUR: 83199 и счетчик SWF: 9199" во второй строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...