2017-02-11 7 views
1

Я рассматривал REGEX как возможное решение проблемы. Я сделал несколько примеров строк, содержащих такие слова, как hello, hellllooo, hhhheello и т. Д. Затем я создал регулярное выражение, чтобы найти все эти типы слов. То, что мне не нужно делать, это посмотреть на предложение, которое может содержать или не содержать введенное слово. Например, вы вводите hellloo, я хотел бы отсканировать свое предложение для слов, похожих на «hellloo», и вернуть «hello», если их найти в предложении. Могу ли я создать регулярное выражение, которое представляет собой переменную ввода пользователя? Если вы наберете hellloo, тогда я построю что-то, возвращающее похожие слова к вашему вводу из предложения или файла.Java, могут ли переменные regex принимать переменные?

Две входные строки

String line = "this is hello helloooo hellllooo hhhel hellll what can I do?"; 
String longLine = "hello man this what can up down where hey my there find now ok stuff jive super sam dude car"; 

мой регулярное выражение функции

public static void regexChecker(String theRegex, String str2Check) { 
     Pattern checkRegex = Pattern.compile(theRegex); 
     Matcher regexMatcher = checkRegex.matcher(str2Check); 

     while(regexMatcher.find()) { 
      if(regexMatcher.group().length() != 0) { 
       System.out.println(regexMatcher.group().trim()); 
      } 
     } 
    } 

работает этот

regexChecker("\\s[h]*[e]*[l]*[l]*[o]*\\s", line); 

возвращается

hello 
hello 
hellllooo 
hellll 

Я хотел бы создать REGEX, основанный на пользовательском вводе 'helllooo', который возвращает привет от второй строки LongLine. Не уверен, что регулярное выражение является правильным решением, но я хотел бы знать, возможно ли это.

+1

Почему вы положили буквы в '[]'? Не. --- Вы действительно хотите, чтобы буквы были необязательными, поэтому они совпадают, например. слово «хо»? Измените '*' на '+', чтобы потребовалось хотя бы одно из каждой буквы. --- Замените оба '' \\ s'' '' \\ b'' для соответствия границам слов. --- Регулярное выражение должно быть '' \\ bh + e + l + l + o + \\ b "'. См. [Regex101] (https://regex101.com/r/sh0bmt/1) для демонстрации. – Andreas

+0

Спасибо, он должен был быть + – Yawn

ответ

1

Предполагая, что ваш пример отражает то, что вы хотите сделать (повторяющиеся буквы из входного слова), вы определенно можете.

Концептуально, вы хотите следующее:

public String makeRegec(String input) { 
    StringBuilder regex = new StringBuilder("\\b"); 
    if(input != null && input.length() > 0) { 

     for (int i = 0; i < input.length(); i++) { 
      regex.append(input.charAt(i)).append("+"); 
     } 
    } 
    regex.append("\\b*");//don't need this if you would accept hello, for example 
    return regex.toString(); 
} 

Конечно, вы могли бы составить картину и вернуть, что вместо

1

попробовать этот

грим функции регулярных выражений:

public static String makeRegex(String input) { 
StringBuilder regex = new StringBuilder(); 
if(input != null && input.length() > 0) { 

    for (int i = 0; i < input.length(); i++) { 
     regex.append("[" + input.charAt(i) + "]{1,}"); 

    } 
} 
return regex.toString(); 
} 

regex функция:

public static ArrayList regexChecker(String theRegex, String str2Check) { 
     Pattern checkRegex = Pattern.compile(theRegex); 
     Matcher regexMatcher = checkRegex.matcher(str2Check); 
     ArrayList<String> list = new ArrayList<>(); 
     String findString = ""; 
     while(regexMatcher.find()) { 
      if(regexMatcher.group().length() != 0) { 
       findString = regexMatcher.group().trim(); 
       list.add(findString); 

      } 
     } 
     return list; 
    } 

использовали:

String line = "this is hello helloooo hellllooo hhhel hellll what can I do?"; 

    String input = "hello"; 

    ArrayList<String> list = regexChecker(makeRegex(input), line); 

    for(int i = 0;i<list.size();i++) 
     System.out.println(list.get(i)); 

возвращается:

hello 
helloooo 
hellllooo 

Заменить строку:

System.out.println(line.replaceAll(makeRegex(input), input)); 
+0

Я уже могу получить этот выход.Я пытаюсь ввести Heeeellllooo и вернуть Hello – Yawn

+0

use ReplaceAll: System.out.println (line.replaceAll (makeRegex (input), input)); –

+0

Почему {1,} вместо + в вашем регулярном выражении? Кроме того, как насчет слов вроде Hello, где есть два 'l' s? Будет ли первый l в регулярном выражении есть все ls? –

1

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

String found = input.replaceAll(".*?((h)+(e)+(l)(l)+(o)+)?.*", "$2$3$4$5$6"); 

Результат будет либо «привет», либо пустым, если на входе ничего нет.