Как я могу изменить регулярное выражение, которое читает векторы для чтения матриц? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующее регулярное выражение, которое читает массивы любого размера, такие как {1.0, 2, 3, 5.4}:

"\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\}"

Как я могу изменить его так, чтобы он читал матрицы любогоразмерность как: {{1.2, 3,4}, {2,3.4,3}} и т. д.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

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

String numRegex = "(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+";
String regex = "\\{\\s*(" + numRegex + "(\\s*,\\s*" + numRegex + ")*\\s*)?\\}";

Хотя я действительно считаю, что часть numRegex неверна, поскольку допускает такой текст, как 1/2-3.4/5-6/7

Теперь вы хотите обернуть это в { xxx , xxx , ... } конструкцию, поэтому

String regex2 = "\\{\\s*(" + regex + "(\\s*,\\s*" + regex + ")*\\s*)?\\}";

Тест

System.out.println("{{1.2, 3,4},{2,3.4,3}}".matches(regex2));
System.out.println("{{1.2, 3,4},{2,3.4,3},}".matches(regex2));

Выход

true
false

Как единое длинное регулярное выражение, которое будет

"\\{\\s*(\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\}(\\s*,\\s*\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\})*\\s*)?\\}"

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

0 голосов
/ 29 ноября 2018

Думаю, вам просто нужно добавить внешние фигурные скобки и повторить существующий шаблон с необязательной запятой: prefix: {(. Внешняя фигурная скобка и открывающие скобки, чтобы существующее регулярное выражение можно было повторить.

"\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\}"

append:,?) +}.запятая - вопросительный знак делает его необязательным, затем закройте скобки и дайте ему возможность повторяться 1 или более раз, и, наконец, окончательную внешнюю фигурную скобку

сложите вместе и добавьте экранирование, необходимое для получения:

"\\{(\\{\\s*((-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+(\\s*,\\s*(-?\\b\\d+(?:\\.\\d+)?(?:/\\d+(?:\\.\\d+)?)?\\b)+)*\\s*)?\\},?)+\\}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...