2013-09-18 5 views
-2

Я следил за всеми ответами, указанными в this link (я изначально опубликовал этот вопрос) и изменил свое регулярное выражение.Ярлык шаблона Java неправильно оценивает регулярное выражение?

Например, мое регулярное выражение теперь,

String regex = "(?i)[a-zA-Z0-9_.|-]*" + searchString + "(?i)[a-zA-Z0-9_.|-]*"; 

Я wnat вернуть «testEcho» и «testEcho-1» в качестве поискового выхода, когда я делаю поиск, используя «тест», как мой SearchString.

Но все же я не смог вернуть testEcho и testEcho-1 в качестве своего результата, когда iICE для строки «test».

Мой код Java:

Pattern pattern=Pattern.compile(regex); 
Matcher matcher = pattern.matcher(Name) 

if (matcher.matches()) { 
return XXX; 
} 

Любая помощь?

Edit:

Pattern pattern=Pattern.compile(regex); 
Matcher matcher1 = pattern.matcher("testEcho") 

    matcher1.matches --------->returns true 

Matcher matcher2 = pattern.matcher("testEcho-1") 

matcher2.matches --------->returns false 
+1

Что вход? Какой результат вы получили? Чего ты ожидал? Что это за возвращение XXX? –

+0

Вы пытались использовать 'matcher.find()'? – BackSlash

+0

вход i s «test», ожидаемый результат - «testEcho» и «testEcho-1». Но теперь я получаю только «testEcho» – Ratha

ответ

3

Я не знаю, как ваш ввод данных выглядит, но вы, вероятно,

  • следует использовать find вместо matches,
  • необходимо либо бежать - в классе символов с \\- или поместить его в начале [-...] или до конца [...-].
  • может заменить a-zA-Z0-9_ на \\w.
  • побег регулярных выражений мета-символы из searchString с использованием Pattern.quote()

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

String regex = "(?i)[\\w.|-]*" + Pattern.quote(searchString) + "[\\w.|-]*"; 

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

public static List<String> giveMe(String searchString, String input) { 
    List<String> results = new ArrayList<>(); 
    String regex = "(?i)[\\w.|-]*" + Pattern.quote(searchString) + "[\\w.|-]*"; 

    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(input); 

    while (matcher.find()) { 
     results.add(matcher.group()); 
    } 

    return results; 
} 

демо

System.out.println(giveMe("test","This is some string with testEcho " + 
     "and even testEcho-1 that I want to parse.")); 

выход:

[testEcho, testEcho-1] 

[править]
Судя по вашему примеру, вы хотите проверить, если вся строка соответствует указано регулярное выражение. В этом случае возможно попробовать этот метод

public static boolean canFind(String searchString, String input) { 
    return input.matches("(?i)[\\w.|-]*" + Pattern.quote(searchString) 
      + "[\\w.|-]*"); 
} 

демо

System.out.println(canFind("test", "testEcho"));//true 
System.out.println(canFind("test", "TestEcho-1"));//true 
System.out.println(canFind("test", "WestEcho-1"));//false 
+0

Это тоже кажется не работает для меня :( – Ratha

+0

@ Ratha вы можете проверить мои обновленный ответ? – Pshemo

+0

ваш образец кода работает отлично..Не могу найти то, что я делаю неправильно с моего конца. Спасибо много, плохо проверьте еще .. – Ratha

1

Я считаю, что вы можете иметь только 1 набор флагов 1 регулярных выражений шаблона даже в Java, и если вы игнорируете дело, нет необходимости для [A-Za-Z]:

String regex = "(?i)[a-z0-9_.|-]*" + searchString + "[a-z0-9_.|-]*"; 
Смежные вопросы