Java - разделить строку с помощью регулярного выражения - PullRequest
7 голосов
/ 19 марта 2011

Мне нужно разбить строку там, где есть запятая, но это зависит от того, где находится запятая.

В качестве примера

рассмотрим следующее:

C=75,user_is_active(A,B),user_is_using_app(A,B),D=78

Я бы хотел, чтобы функция String.split() разделяла их следующим образом:

C=75 

user_is_active(A,B) 

user_using_app(A,B)

D=78

Я могу думать только об одном, но я не уверен, как это выразится в регулярном выражении.

Символы / слова в скобках всегда заглавные.Другими словами, не будет ситуации, когда у меня будет user_is_active(a,b).

Есть ли способ сделать это?

Ответы [ 3 ]

12 голосов
/ 19 марта 2011

Если у вас не более одного уровня скобок, вы можете разделить запятую, за которой не следует закрытие ) перед открытием (:

String[] splitArray = subjectString.split(
    "(?x),   # Verbose regex: Match a comma\n" +
    "(?!     # unless it's followed by...\n" +
    " [^(]*  # any number of characters except (\n" +
    " \\)    # and a )\n" +
    ")       # end of lookahead assertion");

Ваше предлагаемое правило будет переведено как

String[] splitArray = subjectString.split(
    "(?x),        # Verbose regex: Match a comma\n" +
    "(?<!\\p{Lu}) # unless it's preceded by an uppercase letter\n" +
    "(?!\\p{Lu})  # or followed by an uppercase letter");

но тогда вы пропустите разделение текста наподобие

Org=NASA,Craft=Shuttle
0 голосов
/ 19 марта 2011

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

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

рассмотрите возможность использования генератора синтаксических анализаторов для анализа запросов такого типа.Например: javacc или antlr

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