RegEx для сопоставления последнего числа в векторах разных размеров - PullRequest
0 голосов
/ 06 мая 2019

У меня есть эта строка:

values="[72, 216, 930],[250],[72],[228, 1539],[12]";

пытаюсь объединить два шаблона, чтобы получить последнее число в первом типе [] и число во втором типе [].

pattern="\\, ([0-9]+)\\]|\\[([0-9]+)\\]"

Но выводит ноль:

930, null, null, 1539, null

Как мне решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 06 мая 2019

Здесь мы можем не захотеть ограничивать его слева и просто использовать ] справа, затем проведем пальцем влево и собрать наши цифры, возможно, аналогично этому выражению :

([0-9]+)\]

enter image description here

График

Этот график показывает, как это будет работать:

enter image description here

Если хотите, мы также можем связать его слева, аналогично этому выражению :

([\[\s,])([0-9]+)(\])

enter image description here

График

Этот график показывает, как будет работать второй:

enter image description here

2 голосов
/ 06 мая 2019

Чтобы убедиться, что данные на самом деле находятся в квадратных скобках, вы можете использовать группу захвата, начать совпадение с [ и завершить совпадение с ]

\[(?:\d+,\h+)*(\d+)]

В Java

\\[(?:\\d+,\\h+)*(\\d+)]
  • \[ Совпадение [
  • (?:\d+,\h+)* Повторите 0+ раз, сопоставляя 1+ цифру, запятую и 1+ горизонтальные пробельные символы
  • (\d+) Захват в группе 1, соответствующий 1+ цифре
  • ] Соответствует закрывающей квадратной скобке

Regex demo | Java демо

Например:

String regex = "\\[(?:\\d+,\\h+)*(\\d+)]";
String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

Результат:

930
250
72
1539
12
2 голосов
/ 06 мая 2019

Попробуйте это.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = ", ([0-9]+)]";
final String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

Вывод:

Full match: , 930]
Group 1: 930
Full match: , 1539]
Group 1: 1539
1 голос
/ 06 мая 2019
package Sample;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StackOverFlow{


    final static String regex = "\\d*]";
    final static String string = "[72, 216, 930],[250],[72],[228, 1539],[12]";

    final static Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
    final static Matcher matcher = pattern.matcher(string);



    public static void main(String[] args) {
        while (matcher.find()) {
            String val = matcher.group(0).replace("]", "");
            System.out.println(val);
        }
    }
}

выход

930
250
72
1539
12
...