Как поставить аргумент в RegEx?

1

Таким образом, я пытаюсь использовать аргумент в шаблоне RegEx, и я не могу найти шаблон, потому что аргумент представляет собой простую строку, которая содержится в большей строке. Вот сама задача, которую я взял с этого codingbat.com, чтобы все было ясно:

Предпосылка и объяснение задачи.

Учитывая строку и непустую строку слова, верните версию исходной строки, где все символы заменены на плюсы ("+"), за исключением строк строки, которые сохраняются без изменений.

Мой код:

public String plusOut(String str, String word) {
  if(str.matches(".*(<word>.*<word>){1,}.*") || str.matches(".*(<word>.*<word>.*<word>){1,}.*")) {
  return str.replaceAll(".", "+");  //after finding the argument I can easily exclude it but for now I have a bigger problem in the if-condition
  } else {
  return str;
  }
}

Есть ли способ в Java сопоставить аргумент? Вышеприведенный код не работает по понятным причинам (<word>). Как использовать word аргумента в строке RegEx?

ОБНОВИТЬ

Это ближайший я получил, но он работает только для последнего символа слова String.

public String plusOut(String str, String word) 
{
  if(str.matches(".*("+ word + ".*" + word + "){1,}.*") || str.matches(".*(" + word + ".*" + word + ".*" + word + "){1,}.*") || str.matches(".*("+ word + "){1,}.*")) 
  {     
     return str.replaceAll(".(?<!" + word + ")", "+");
  } else {
     return str;
  }
}

Ввод, вывод

plusOut ("12xy34", "xy") → "+++ y ++" (ожидаемый "++ xy ++")
плюсOut ("12xy34", "1") → "1+++++" (Ожидаемый "1+++++")
plusOut ("12xy34xyabcxy", "xy") → "+++ y +++ y ++++ y" (ожидаемый "++ xy ++ xy +++ xy")

Это из-за? в RegEx.

  • 2
    Может быть, какой-то ввод / вывод будет лучше для нас, чтобы понять проблему.
  • 0
    @NeerajJain Пример plusOut("12xy34", "xy") → "++xy++" и слово "xy", но оно также может встречаться много раз, и я ищу регулярное выражение, соответствующее второму аргументу.
Показать ещё 5 комментариев
Теги:
string
arguments
argument-passing

3 ответа

0
Лучший ответ

Вы не можете делать это только с шаблонами, вам придется писать код отдельно от шаблона. Попробуй это:

public static String plusOut(String input, String word) {

    StringBuilder builder = new StringBuilder();
    Pattern pattern = Pattern.compile(Pattern.quote(word));
    Matcher matcher = pattern.matcher(input);
    int start = 0;

    while(matcher.find()) {
        char[] replacement = new char[matcher.start() - start];
        Arrays.fill(replacement, '+');
        builder.append(new String(replacement)).append(word);
        start = matcher.end();
    }
    if(start < input.length()) {
        char[] replacement = new char[input.length() - start];
        Arrays.fill(replacement, '+');
        builder.append(new String(replacement));
    }

    return builder.toString();
}
0

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

public String plusOut(String str, String word) 
{
  if(str.matches(".*("+ word + ".*" + word + "){1,}.*") || str.matches(".*(" + word + ".*" + word + ".*" + word + "){1,}.*")) 
  {
     return str.replaceAll(".", "+");
  }
  else
  {
     return str;
  }
}
0

Вам нужно сцепить его с помощью + оператора Java

if(str.matches("<"+word+">")){ // Now word will be replaced by the value
//do Anything
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню