Таким образом, я пытаюсь использовать аргумент в шаблоне 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.
Вы не можете делать это только с шаблонами, вам придется писать код отдельно от шаблона. Попробуй это:
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();
}
Вы не можете размещать аргументы внутри шаблона регулярного выражения. Вы можете создать объект регулярного выражения, объединив переменные с частями шаблона регулярного выражения следующим образом:
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;
}
}
Вам нужно сцепить его с помощью +
оператора Java
if(str.matches("<"+word+">")){ // Now word will be replaced by the value
//do Anything
}
plusOut("12xy34", "xy") → "++xy++"
и слово "xy", но оно также может встречаться много раз, и я ищу регулярное выражение, соответствующее второму аргументу.