Regex для разделения строки по первой косой черте и запятой с условием - PullRequest
1 голос
/ 10 марта 2011

Мне нужно два разных регулярных выражения, чтобы разделить строки, для следующих сценариев. Использование платформы Java .

1. Требуется разделить только первым символом "/", и если косая черта находится в скобках "{}", то его не следует рассматривать А также мне нужно усечь начальные и конечные скобки "{}" только в том случае, если это соответствует примеру c).

а)

input: "Response/CartResponse/{StatusData/ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}},{ServiceHeaders/clientSessionKey},{Shoppingcart/OrderId,CatalogId}";

output: 
"Response"
"CartResponse/{StatusData/ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}},{ServiceHeaders/clientSessionKey},{Shoppingcart/OrderId,CatalogId}";
-------------

б)

input: "CartResponse/{StatusData/ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}},{ServiceHeaders/clientSessionKey},{Shoppingcart/OrderId,CatalogId}";

output: 
"CartResponse"
"{StatusData/ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}},{ServiceHeaders/clientSessionKey},{Shoppingcart/OrderId,CatalogId}";
-------------

в)

input: "ArrivalMethods/{AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}";

output: 
"ArrivalMethods"
"AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter"

2. Разбить на запятую, и если запятая находится в скобках "{}", это не будет А также мне нужно удалить "{}", как в следующих примерах.

input: "{StatusData/ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod /AvailableArrivalMethodName,AvailableFFMCenter}},{ServiceHeaders/clientSessionKey},{Shoppingcart/OrderId,CatalogId}";  

output: 
"StatusData/ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}"
"ServiceHeaders/clientSessionKey"
"Shoppingcart/OrderId,CatalogId"



input: "ResponseCode,RespMessage,{ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter}";

output: 
"ResponseCode"
"RespMessage"
"ArrivalMethods/AvailableArrivalMethod/AvailableArrivalMethodName,AvailableFFMCenter";

Усечающие скобки различны в обоих случаях.

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Разница между вариантами a, b и c заключается в том, что a и b встраивают {} внутри {}, а c - нет. Плохие новости, которые не могут быть достигнуты одним регулярным выражением. Более того, гарантировать баланс {} было бы кошмарно.

В любом случае, то, что вы описываете здесь, в основном является языком, поэтому для него лучше создать синтаксический анализатор (либо вручную, либо с помощью инструмента, такого как ANTLR или JavaCC).

0 голосов
/ 10 марта 2011

Эта проблема, как вы описали, может быть решена с помощью сравнения строк и манипуляций, без регулярных выражений.Попробуйте написать метод, который разбивает каждый случай на отдельные условия и обрабатывает его соответствующим образом, например:

public String[] parseInput(String s) {
  if (s.startsWith("Response/") || s.startsWith("CartResponse/")) {
    // Examples (1.a), (1.b)
    return str.split("/", 2);
  } else if (str.startsWith("ArrivalMethods")) {
    // Example (1.c)
    String[] ss = str.split("/", 2);
    ss[1] = ss[1].substring(1, ss[1].length() - 1);
    return ss;
  } else if (s.startsWith("{")) {
    // Example (2.a)
    // ...
  }
  return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...