2013-04-30 3 views
-3

Как разделить следующую строкунеобходимо регулярное выражение для разделения строки

String str = "(obj.userAge EQUALS 51) AND (obj.userAddress CONTAINS STREET1)"; 

, так что я должен получить

string 1 = "obj.userAge EQUALS 512"; 
string 2 = "obj.userAddress CONTAINS STREET1"; 

Я попытался с

str.split("AND") 

но мне нужна строка без скобок

когда-нибудь я могу получить строку из базы данных, как

String str = "(obj.userAge EQUALS 51) AND (obj.userAddress CONTAINS STREET1) OR (obj2.salary >= 3000)"; 

так что теперь OR добавляется.

+0

Ошибка, которую вы делаете, думает об этом как о задании для 'split()'. Это намного проще, если вы подходите к нему как к операции 'find()', как показывают некоторые из ответов. (Я предпочитаю [решение Ачинтья Джа] (http://stackoverflow.com/a/16300512/20938).) –

ответ

3

Попробуйте это:

public static void main(String[] args) { 
    String str = "(obj.userAge EQUALS 51) AND (obj.userAddress CONTAINS STREET1)"; 
    Pattern pattern = Pattern.compile("\\((.+?)\\)"); 
    Matcher matcher = pattern.matcher(str); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 

} 

Выход:

obj.userAge EQUALS 51 
obj.userAddress CONTAINS STREET1 
+0

Мне тоже не нужна скобка. – AmitG

+1

Просто измените 'matcher.group()' на 'matcher.group (1)' – nhahtdh

+0

@AmitG Я отредактировал свой ответ. –

2

Вы должны матч его с этим регулярным выражением

(?<=\\().*?(?=\\)) 

. соответствует одному символу.

* является квантором, что соответствует 0 многим предыдущего символа

.*? матчей 0 до многих персонажей лениво

(?<=) является положительным которые просмотром назад проверяет для шаблона до текущего position.So (?<=a)b бы соответствует b, только если ему предшествует

(?=) является положительным взглядом, который проверяет для шаблона после текущего position.So a(?=b) будет соответствовать a только если за ним следует b

+0

+1. Или просто это регулярное выражение '\\ ((. *?) \\)' – Maroun

+0

@MarounMaroun ему не нужно '(', ')' – Anirudha

+0

Это не вернет '(' и ')'. – Maroun

0

Это регулярное выражение будет генерировать группу для каждого из кронштейнов, которые вы затем можете получить: \((.*)\)\sAND\s\((.*)\)

+1

Это не работает, '. *' Жадный. – Quetzalcoatl

0

И еще один (для удовольствия) с использованием guava:

Iterable<String> result = Splitter.on(Pattern.compile("\\(|\\)|AND")).omitEmptyStrings().trimResults().split(input); 
Смежные вопросы