2014-11-04 4 views
0
String abc = "||:::|:|::"; 

Он должен быть возвращен, если есть два | и три изображения :.
Я не уверен, как использовать «регулярное выражение» или если это правильный метод. В строке abc нет определенного шаблона.Как я могу искать два конкретных символа в строке?

+0

Вы имеете в виду, что он должен возвращать 'true', если он содержит' || ::: ', или если он содержит' || 'и' ::: 'независимо от порядка или позиции (' ::: || 'или ': ||: | :::' ...)? – MadProgrammer

+0

true, если он содержит | и: независимо от позиции – user3413152

+2

Is '': |: |: "' также правильно (он содержит два '|' и три ':')? – Pshemo

ответ

0

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

".*||.*:::.*" 

Если вы хотите просто проверить наличие персонажей и их независимо от их, чтобы затем использовать String.matches метод с помощью двух регулярных выражений с логическим И

".*|.*|.*" 

".*:.*:.*:.*" 

Вот это cheat sheet for regular expressions. Его довольно просто узнать. Посмотрите на группы и квантификаторы в документе, чтобы понять вышеприведенное выражение.

+0

Кто говорит, что '||' должен быть помещен перед ':::'? В [этом комментарии] (http://stackoverflow.com/questions/26746658/how-can-i-look-for-two-specific-characters-in-a-string#comment42078572_26746658) OP-заявки "содержит: и: независимо позиции ". – Pshemo

0

Использование регулярного выражения было бы плохой идеей, особенно если для них нет конкретного порядка. Сделать функцию, которая подсчитывает количество раз персонаж sppears в строке, и использовать это:

public int count(String base, char toFind) 
{ 
    int count = 0; 
    char[] haystack = base.toCharArray(); 
    for (int i = 0; i < haystack.length; i++) 
     if (haystack[i] == toFind) 
      count++; 
    return count; 
} 

String abc = "||:::|:|::"; 
if (count(abc,"|") >= 2 && count(abc,":") >= 3) 
{ 
    //Do some code here 
} 
0

Мой любимый метод для поиска количества символов в строке является int num = s.length() - s.replaceAll("|","").length(); вы можете сделать это для обоих и испытания те ints.

0

Если вы хотите протестировать все условия в одном регулярном выражении, вы можете использовать look-ahead(?=condition).

Ваше регулярное выражение может выглядеть

String regex = 
     "(?=(.*[|]){2})"//contains two | 
     + "(?=(.*:){3})"//contains three : 
     + "[|:]+";//is build only from : and | characters 

Теперь вы можете использовать его с matches как

String abc = "||:::|:|::"; 
System.out.println(abc.matches(regex));//true 

abc = "|::::::"; 
System.out.println(abc.matches(regex));//false 

Во всяком случае я, вы можете избежать регулярных выражений и написать свой собственный метод, который рассчитает количество | и : в вашей строке и проверьте, больше ли эти цифры или равны 2 и 3. Вы можете использовать StringUtils.countMatches от apache-commons так что ваш тестовый код может выглядеть

public static boolean testString(String s){ 
    int pipes = StringUtils.countMatches(s, "|"); 
    int colons = StringUtils.countMatches(s, ":"); 
    return pipes>=2 && colons>=3; 
} 

или

public static boolean testString(String s){ 
    return  StringUtils.countMatches(s, "|")>=2 
      && StringUtils.countMatches(s, ":")>=3; 
} 
0

Не проверял, но это должно работать

Pattern.compile("^(?=.*[|]{2,})(?=.*[:]{3,})$"); 

Вся строка считывается ?=.* и проверяется Wether допустимые символы (|) встречаются не менее двух раз. То же самое делается для :, только это должно совпадать как минимум три раза.

+0

Проверено, похоже, не работает. –