Java регулярное выражение разделено на пробел / не предшествует - PullRequest
5 голосов
/ 20 февраля 2020

Я хотел бы разбить строку: "x= 2-3 y=3 z= this, that" Я бы разбил это на один или несколько пробелов, которым не предшествует '=' или ',' означает группу одну: "x= 2-3" two: "y=3" three: "z= this, that" У меня есть выражение, которое вроде как делает это, но его хорошо только если = или, после него только один пробел.

(?<![,=])\\s+ 

Ответы [ 4 ]

2 голосов
/ 20 февраля 2020

Если подумать наоборот (смотреть вперед, а не назад), подойдет ли вам следующее?

\\s+(?=\\S*=)
  • \\s+ - один или несколько пробельных символов
  • (?=\\S*=) - положительный прогноз, чтобы убедиться, что за ним следует столько непробельных символов и буквальный знак равенства.
1 голос
/ 20 февраля 2020

Этот разделен на пробел, за которым следует некоторое непустое пространство, затем =: "\\s+(?=[^=\\s]+=)":

jshell> "x=   2-3   y=3 z=   this,   that".split("\\s+(?=[^=\\s]+=)")
$10 ==> String[3] { "x=   2-3", "y=3", "z=   this,   that" }
0 голосов
/ 20 февраля 2020

Если вы хотите использовать отрицательную перспективу, вы можете утверждать, что слева находится шаблон, который будет соответствовать, например, x= 2-3 и совпадать со следующими пробельными символами.

Использовать с отрицанием класс символов [^\\h=,] для соответствия любому символу, кроме перечисленных в нем.

(?<=[^\\h=,]=\\h{0,100}[^\\h=,]{1,100})\\h+

Regex demo | Java demo

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

В Java вам нужно использовать двойные экранированные символы, и вы можете использовать \h для соответствия 1+ горизонтальным символам пробелов вместо \s

Java не поддерживает бесконечную ширину в заднем плане, но поддерживает конечную ширину.

Например

String s = "x=   2-3   y=3 z=   this,   that";
String regex = "(?<=[^\\h=,]=\\h{0,100}[^\\h=,]{1,100})\\h+";
String parts[] = s.split(regex);

for (String part : parts)
    System.out.println(part);

Выход

x=   2-3
y=3
z=   this,   that
0 голосов
/ 20 февраля 2020

Здесь может быть сложно сформулировать логики чистого регулярного разбиения c. Вместо этого я бы использовал здесь формальное сопоставление с шаблоном регулярного выражения:

[^=\s]+\s*=.*?(?=[^=\s]+\s*=|$)

Пример сценария:

String input = "x=   2-3   y=3 z=   this,   that";
String pattern = "[^=\\s]+\\s*=.*?(?=[^=\\s]+\\s*=|$)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);
while (m.find()) {
    System.out.println("match: " + m.group(0));
}

Это печатает:

match: x=   2-3   
match: y=3 
match: z=   this,   that

Здесь является объяснением шаблона регулярного выражения:

[^=\s]+           match a variable
\s*               followed by optional whitespace
=                 match =
.*?               consume everything, until seeing the nearest
(?=
    [^=\s]+\s*=   the next variable followed by =
    |             or
    $             or the end of the input (covers the z= case)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...