2013-03-31 6 views
0

Я пытаюсь внедрить wild cards в Java.Поиск Wild Card в Java

Вот код, у меня есть:

public class Assign { 

public boolean compare(String s1, String s2) 
{ 
    char [] s3 = s1.toCharArray(); 
    char [] s4 = s2.toCharArray(); 
    int i,j; 

    int k = 0; 
    for(i=0;i<s3.length;i++) 
    { 
     for(j=0;j<s4.length;j++) 
     { 
      if(s3[i] == s4[j]) 
      { 

       if(s4[j] == '*') 
       { 
        i++; 

        if(s3[i] == s4[s4.length-1]) 
        { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 
public static void main(String args[]) 
{ 
    Assign a = new Assign(); 
    boolean r = a.compare("a hello b", "a * b"); 
    System.out.println(r); 
} 
} 

Там будет два параметра, передаваемые функции. Один - это строка, а другая - регулярное выражение.

Пример случая:

1) Если строка, переданная является «Привет б» и регулярное выражение «а * Ь», то функция должна возвращать TRUE, потому что в месте * любое количество символы могут существовать.

2) Если строка передана «a X b», а регулярное выражение «a? B», то возвращаемое значение должно быть TRUE, потому что если есть? в регулярном выражении, тогда должен быть только один символ между a и b.

В этом случае он будет работать для всех случаев. Я думаю, что логика, которую я думал, хороша, но у меня проблемы с кодированием.

Я не хочу импортировать Pattern и Matcher. Без них я должен закончить это.

Пожалуйста, помогите мне в этом, указав правильный код.

Поблагодарили

+0

You может вызвать это что-то еще, но регулярное выражение не определено, как вы его определили. – ddmps

+0

Почему бы вам просто не взять подстроку между 'a' и 'b' и проверить. –

+0

спецификация, которую вы предоставили, не очень тщательна. эта система строго ограничена пробелами?что именно должно произойти, если строка соответствия - это что-то вроде '??? a? hello *! whatever'? применяются ли те же правила? если ваши строки соответствия будут такими же простыми, как ваши примеры, вы можете разделить строки на символ пробела и выполнить некоторые базовые проверки с помощью цикла, возможно, –

ответ

0

Предполагая, что регулярное выражение будет содержать только либо * или ? в любой момент времени

Я написал простую программу, используя substring() & indexOf(), что шины для оценки regex против строки в сравнить.

package problems; 

public class WildCardCompare { 

    public boolean compare(String str, String regex) { 
     if(regex == null || str == null) { 
      return false; 
     } 
     if(regex.equals("*")) { 
      return true; 
     } 
     if(regex.equals("?") && str.length() == 1) { 
      return true; 
     } 
     if(!regex.contains("*") && !regex.contains("?")) { 
      return str.equals(regex); 
     } 

     String token = null; 
     if(regex.contains("*")) { 
      token = "*"; 
     } 

     if(regex.contains("?")) { 
      token = "?"; 
     } 

     if(token != null) { 
      //String before *, if any... 
      String before = regex.substring(0, regex.indexOf(token)); 
      //String after *, if any... 
      String after = regex.substring(regex.indexOf(token)+1, regex.length()); 

      boolean bmatches = true; 
      if(before != null && before.length() != 0) { 
       if(str.indexOf(before) == 0) { 
        bmatches = true; 
       } 
       else { 
        bmatches = false; 
       } 
      } 
      boolean amatches = true; 
      if(after != null && after.length() != 0) { 
       if(str.indexOf(after) == (str.length() - after.length())) { 
        amatches = true; 
       } 
       else { 
        amatches = false; 
       } 
      } 
      return bmatches && amatches; 
     } 

     return false; 
    } 

    public static void main(String args[]) 
    { 
     boolean r; 
     WildCardCompare compare = new WildCardCompare(); 
     r = compare.compare("a b hello", "a b *"); 
     System.out.println(r); 
     r = compare.compare("a hello b", "a * b"); 
     System.out.println(r); 
     r = compare.compare("a hello b", "aaaa*bbbb"); 
     System.out.println(r); 
     r = compare.compare("aaaaTbbbb", "aaaa*bbbb"); 
     System.out.println(r); 
     r = compare.compare("aT", "a?"); 
     System.out.println(r); 
     r = compare.compare("AT", "a?"); 
     System.out.println(r); 
     r = compare.compare("aXb", "a?b"); 
     System.out.println(r); 
     r = compare.compare("abc", "xyz"); 
     System.out.println(r); 
    } 
} 

И вот выход.

true 
true 
false 
true 
true 
false 
true 
false 

Я чувствую, эта программа не является «дураком» и может быть принята только в качестве примера, чтобы решить проблему соответствия регулярных выражений

PS: Пожалуйста, смотрите https://softwareengineering.stackexchange.com/ для многих таких видов проблем

+0

Большое спасибо @Sanbhat. Ваш код мне очень помог! –

3

Использовать регулярные выражения. Не изобретайте велосипед.

0

Как я уже сказал, вы можете сделать это, извлекая простую подстроку. Здесь я проверил для одного случая, делаю то же самое для других случаев.

 public class Assign { 

public boolean compare(String s1, String s2) 
{ String s=""; 
    try 
    { 
s=s1.substring(s1.indexOf('a')+2,s1.indexOf('b')-1); 
    } 
    catch(IndexOutOfBoundsException e) 
    { 
    return false; 
    } 
    System.out.println("string: "+s); 

    if(s2.substring(2,3).equals("*")&&s.length()>=1) 
    {return true;} 
    else 
     return false; 

} 
public static void main(String args[]) 
{ 
    Assign a = new Assign(); 
    boolean r = a.compare("a b hello", "a * b"); 
    System.out.println(r); 
} 
} 

EDIT: Может быть я не проверил для всех в cases.It в способ приблизиться.

+0

Я чувствую, что это решение недостаточно общего. Например - boolean r = a. compare ("ab hello", "ab *"); бросил IndexOutOfBoundException – sanbhat

+0

@sanbhat отредактировал. –

+0

Теперь программа дает мне «ложь». Но сравнение «a b hello», «a b *» должно возвращать «true»; – sanbhat

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