2017-01-11 2 views
2

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

Например:

The string "test.toto, test->toto.value(), sizeof(test, toto)" should return this list '[test.toto, test->toto.value(), sizeof(test, toto)]' 

The string "test.toto, test.value(), toto" should return this list '[test.toto, test.value(), toto]' 

The string "toto, toto<titi, tutu>&, titi" should return this list '[toto, toto<titi, tutu>&, titi]' 

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

',(?![^(]*\))(?![^<>]*\>)' 

но это не дает хороший результат для первого примера.

У кого-то есть идея?

Заранее благодарен!

ответ

1

Я создал шаблон, который соответствует группам, разделенным запятой, а не пытается совместить запятую. Следовательно, код Java не расщепляется разделителем, но вместо этого вербует все соответствующие группы:

@RunWith(Parameterized.class) 
public class RegexTest { 

    private final String testString; 
    private final Collection<String> expectedResult; 


    public RegexTest(String testString, String[] expectedResult) { 
     this.testString = testString; 
     this.expectedResult = Arrays.asList(expectedResult); 
    } 

    private Collection<String> findMatchedWords(String sentence) { 
     Pattern pattern = Pattern.compile("((\\<.*?\\>|\\(.*?\\)|[^, ])+)"); 

     Matcher matcher = pattern.matcher(sentence); 
     List<String> matches = new ArrayList<>(); 

     while(matcher.find()){ 
      matches.add(matcher.group()); 
     } 
     return matches; 
    } 


    @Test 
    public void testPattern() {   
     Collection<String> actualResult = findMatchedWords(testString); 

     TestCase.assertEquals(expectedResult, actualResult); 
    } 


    @Parameters 
    public static Iterable<?> getTestParamters() { 
     Object[][] parameters = { 
       {"test.toto, test.value(), toto", new String[] { "test.toto", "test.value()", "toto" }}, 
       {"test.toto, test->toto.value(), sizeof(test, toto)", new String[] { "test.toto", "test->toto.value()", "sizeof(test, toto)" }}, 
       {"toto, toto<titi, tutu>&, titi", new String[] { "toto", "toto<titi, tutu>&", "titi" }} 
     }; 
     return Arrays.asList(parameters); 
    } 
} 

EDIT: Я неправильно интерпретировал пример OP, содержащий < и>, но это исправлено.

+0

Я изменил шаблон на '((\\ <.*?\\> | \\ (. *? \\) | [^,]) +)', и он работает !! благодаря –

0

Я написал этот метод, сделать работу

public static List<String> splitByUpperComma(String toSplit) { 
    int parenthesisCount = 0; 
    boolean innerChevron = false; 
    int pos = 0; 
    ArrayList<Integer> indexes = new ArrayList<Integer>(); 

    for (char currentChar : toSplit.toCharArray()) { 
     if (currentChar == '(') { 
      parenthesisCount++; 
     } else if (currentChar == ')') { 
      parenthesisCount--; 
     } else if (currentChar == '<') { 
      innerChevron = true; 
     } else if (currentChar == '>') { 
      innerChevron = false; 
     } else if (currentChar == ',' && !innerChevron && parenthesisCount == 0) { 
      indexes.add(pos); 
     } 
     pos++; 
    } 

    ArrayList<String> splittedString = new ArrayList<String>(); 
    int previousIndex = 0; 
    for (Integer idx : indexes) { 
     splittedString.add(toSplit.substring(previousIndex, idx)); 
     previousIndex = idx + 1; 
    } 
    splittedString.add(toSplit.substring(previousIndex, toSplit.length())); 

    return splittedString; 
} 

Но это не регулярное выражение ..

0

я не могу проверить это, потому что я не на компьютере, но дать этому попытку :

(?:[,]?)([^,]*([(<].*?[)>])?[^,]*)

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

+0

Приятное написанное пользователем регулярное выражение, но оно не подходит для того, что я пытаюсь сделать:/ –

+0

Я забыл добавить круглые скобки вокруг catch для() или <>. Попробуйте сейчас, и дайте мне знать, что вы получите, если это не то, что вы хотите. – drognisep

+0

Он ловит все «,» в тексте –

Смежные вопросы