Regex для ввода слов между первым двоеточием и последними квадратными скобками, имеющими двоеточие: в нем - PullRequest
0 голосов
/ 27 марта 2019

У меня есть строка, которую я хочу проанализировать. Строка выглядит так: -

00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]

Обратите внимание, что в последней квадратной скобке есть: двоеточие. и символ перед Some More также является двоеточием. Я хочу захватить все символы между ними.

В настоящее время я анализирую его с помощью следующего регулярного выражения в два этапа. Вот код Java.

class JavaReg{

 public static void main(String[] args){

   String str = "00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]";
   String[] strArr = str.split("\\[.*?\\]\\:\\s");
   String[] str12 = strArr[1].split("\\[\\w*?\\:.*");
   for(String strinj : strArr)
      System.out.println(strinj);

   System.out.println(str12[0]);
 }

}

Ниже приведен результат вышеописанного упражнения.

00:0qwe8.0 donald controller duck
Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]
Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#]

Последняя строка - это то, что я хочу. Он начинает захватывать с двоеточия: и продолжает захватывать до квадратной скобки с двоеточием.

Вопрос в том, могу ли я использовать захват групп в регулярных выражениях, чтобы захватить их за один выстрел. Как это сделать на Java?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Вы можете использовать это единственное регулярное выражение для захвата нужной вам строки:

(?<=\]: ).*(?=\[)

Демо

Здесь, (?<=\]: ) этоположительный взгляд на совпадения ]: буквально, чтобы соответствовать вашим данным, как вы упомянули, и с этого момента, жадно захватывает все, пока не увидит последний [, который также содержит двоеточие, и хотя с тех пор это было точкой, до которой вы хотелизахватывать, я не ставил ограничений для двоеточия дальше.

Но если вы хотите также применить его, следует прекратить сопоставление непосредственно перед [something1:something2], тогда вы можете использовать это регулярное выражение,

(?<=\]: ).*(?=\[[^[\]]*:[^[\]]*\])

Демонстрация с более точным регулярным выражением

Код Java

String s = "00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]";
Pattern p = Pattern.compile("(?<=\\]: ).*(?=\\[[^\\[\\]]*:[^\\[\\]]*\\])");
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group());
}

Отпечатки:

Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#]
1 голос
/ 27 марта 2019

Вы можете использовать следующее регулярное выражение для извлечения совпадения:

\[[^\]\[]*\]:\s*(.*?)\[\w*:

См. Демо регулярное выражение .

Подробно

  • \[ - [ символ
  • [^\]\[]* - 0+ символов, отличных от ] и [
  • \]: - a ]: подстрока
  • \s* - 0+ пробелов
  • (.*?) - Группа 1: любые 0 или более символов, кроме символов разрыва строки, как можно меньше
  • \[ - [ char
  • \w* - 0+ буква, цифра или _
  • : - двоеточие.

Используйте егос Matcher#find() и захватом matcher.group(1), см. демонстрационную версию Java :

String str = "00:0qwe8.0 donald controller duck [02009&123@##]: Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#][15b:31013]";
Pattern pattern = Pattern.compile("\\[[^\\]\\[]*\\]:\\s*(.*?)\\[\\w*:");
Matcher matcher = pattern.matcher(str);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 
// => Some more sring here Model number 420 Family [Super-cool] [15b31013^^@#]
...