2013-04-28 5 views
2

Я пишу пример приложения, в котором я наткнулся на следующую проблему:метод для проверки соответствующих открытия/закрытия «скобки»

Я должен проверить персонажей с точки зрения их «совместимости».

boolean checkIfPairCorrect(Character c1, Character c2) {...} 

Вкратце это выглядит так: «Проверьте, правильно ли эти символы создают правильную пару« открыть-закрыть ». Например:

Пары "(" и ")" возвращает TRUE,
пары "{" и "}" возвращает TRUE,
пары "(" и "}" возвращает FALSE, // incompatibile скобки
пар ")»и„(“возвращает FALSE // неправильный порядок
пару„а“и„3“возвращает FALSE //„A“или„3“не символы, для которых„закрытия“символ можно найти

Вы сказали бы: «Просто напишите регулярного человека !!!», используя некоторую интернет-помощь, например:

Regular Expression to match outer brackets
Regex to restrict only one occurrence of open and close brackets using C#
Regexp and brackets article

И вы были бы правы, но ... Проблема трудно для меня, потому что функция может принимать какие-то экзотические символы в качестве параметров (UTF-8 кодирование), как японский, турецкий, арабский и т. д. Я не знаю, какие символы можно рассматривать как пару с открытым концом на других языках (культурах), поэтому я ищу библиотеку, которая может решить мою проблему.

Вопрос: Знаете ли вы какую-либо библиотеку, которая может быть полезной в моем случае, или у вас есть какие-либо рекомендации по ее устранению?

+2

Я думаю, что после [этого ответа] (http://stackoverflow.com/a/546457/335858) было бы ясно, что вы не можете делать это в regexp, даже теоретически: модель regexp не поддерживает подсчет , Это неправильный инструмент для работы. – dasblinkenlight

+0

@ dasblinkenlight это не о разборке более длинного текста, а о поиске пары для персонажа. И вы можете сделать это с регулярным выражением. – hyde

+0

@hyde Да, вы правы. –

ответ

3

Почему нет карты, как это:

Map<Character, Character> pairs = new HashMap<Character, Character>(); 
pairs.put('(', ')'); 
pairs.put('{', '}'); 
pairs.put('[', ']'); 
... 

Тогда ваш метод может быть

boolean checkIfPairCorrect(char c1, char c2) { 
    return pairs.get(c1) == c2; 
} 
+0

собирался рекомендовать то же самое, вы были слишком быстры! :-) – sanbhat

+2

Да, да ... Это, конечно, правильно, но вопрос в том, знаете ли вы какую-нибудь библиотеку, в которой все пары готовы к использованию ... Я имею в виду, какие «konws», например, все возможные пары открытого и закрытого UTF-8 encoding;) –

1

Для полноты, вот как вы можете сделать это с помощью регулярных выражений:

boolean checkIfPairCorrect(Character c1, Character c2) { 
    String str = c1.toString() + c2.toString(); 
    return str.matches(
      "(\\[\\])" 
     + "|(\\(\\))" 
     + "|({})" 
     // ... add any more you may want 
     ); 
} 

Но я бы сделал это, используя карту, как показывает ответ ARS.

О вашем реальном вопросе, я не знаю, есть ли библиотека, и я не думаю, например. Юникод имеет некоторый опрятный способ определения этих пар. Таким образом, лучше всего использовать метод карты и жестко программировать пары самостоятельно, возможно, с the list in this Wikipedia page.

+0

+1 для wiki-страницы;) –

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