Применяйте регулярные выражения после определенного символа - PullRequest
1 голос
/ 08 мая 2011

У меня есть строка, которую я хочу разобрать в массив. Данная строка имеет вид P[AB, AC, AD] (A1, A2, A3). Я хочу сохранить его в таком массиве, чтобы все данные после первого ( были отфильтрованы по условиям регулярного выражения:

P[AB, AC, AD]  
A1  
A2  
A3 

Вот что я придумал:

String regex = "/^(([,()]+)$";  
String[] numbers = stringIn.split(regex);

Моя проблема в том, что он просто не работает, потому что регулярное выражение не отфильтровывает кусочки, все хранится в numbers[0].

Ответы [ 3 ]

1 голос
/ 08 мая 2011

Я думаю, это то, что вы пытались:

String regex = "[ ,()]+(?=[^\\]]*$)";

String stringIn = "P[AB, AC, AD] (A1, A2, A3)";
String[] numbers = stringIn.split(regex);
for (String n : numbers)
{
  System.out.println(n);
}

выход:

P[AB, AC, AD]
A1
A2
A3

[ ,()]+ part пытается сопоставить пробелы, запятые и скобки, где бы они ни появлялись, но (?=[^\\]]*$) (положительный lookahead ) отфильтровывает любое совпадение перед ]. Я предполагаю, что в строке есть только один набор квадратных скобок.

0 голосов
/ 08 мая 2011

Мысль о менее изящном, но, возможно, более простом способе сделать это:

// Split the string into two parts.
// parts[0] == "P[AB, AC, AD]"
// parts[1] == "A1, A2, A3"
String[] parts = stringIn.split(" *\\(|\\)");
// Split the second part into its components.
String[] secondParts = stringInParts[1].split(", *");
// Combine the results.
String[] numbers = new String[secondParts.length + 1];
numbers[0] = parts[0];
System.arrayCopy(secondParts, 0, numbers, 1, secondParts.length);
0 голосов
/ 08 мая 2011

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

Pattern regex = Pattern.compile("\\(([^)]+)");
Matcher m = regex.matcher(stringIn);
if (m.find()) {
  String[] numbers = m.group(1).split("[,\\s]+");
}

Наконец, в отличие от JavaScript, C # и Python, $ в Java не соответствует концу ввода. Вам нужно использовать \\z вместо этого. $ в Java совпадает в конце ввода или непосредственно перед последним переводом строки, если в конце ввода есть разрыв строки.

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