Таким образом, он возвращает некоторые ошибки, и кажется, что основными примерами являются символы из двух символов, например, "++" заменяется на "# ++ #", в то время как он близок к замене All () "на" ## + ## + ## ".
return lexeme.replaceAll(
"= = ", "#==#"
).replaceAll(
"&&", "#&&#"
).replaceAll(
" = ", "#=#"
).replaceAll(
">", "#>#"
).replaceAll(
"++", "#++#"
).replaceAll(
"< = ", "#<=#"
).replaceAll(
"!", "#!#"
).replaceAll(
"-", "#-#"
).replaceAll(
"--", "#--#"
).replaceAll(
"+", "#+#"
).replaceAll(
"+ = ", "#+=#"
).replaceAll(
"*", "#*#"
).replaceAll(
",", "#,#"
).replaceAll(
".", "#.#"
).replaceAll(
"[", "#[#"
).replaceAll(
"{", "#{#"
).replaceAll(
"(", "#(#"
).replaceAll(
")", "#)#"
).replaceAll(
"}", "#}#"
).replaceAll(
"]", "#]#"
).split( "#");
}
Вы можете сделать это с помощью одного вызова replaceAll, используя обратную ссылку $1 в строке замены: return lexeme.replaceAll("(==?|&&|\\+[+=]?|<=|--?|[>!*,.\\[{()}\\]])", "#$1#").split("#");
Большое спасибо, но мне нужно знать, есть ли способ без проблем, потому что способ, которым я написал, возвращает некоторые проблемы.
Спасибо @Andreas! Я попробую так!
@Andreas, у меня все еще проблема со следующим примером: "++ k". В этой лексеме метод split не возвращает массив строк. Вы что-нибудь об этом знаете?
И @Andreas для ";" символ, только этот случай работал для split: ");". Остальные случаи: 45; не работает.
не могли бы вы показать использование некоторых входных и ожидаемых результатов, пожалуйста?
@IgorNunes В вашем коде нет ;, поэтому не знаю, о чем вы говорите. Что касается "++k", то с приведенным мной кодом в результате я получаю [, ++, k], поэтому он работает нормально ("++k" превращается в "#++#k", который разделяется на ["", "++", "k"]).




Основная проблема правильности, возможно, заключается в том, что вы вызываете replaceAll() в результате предыдущей замены, поэтому, например, == сначала заменяется на #==# из-за правила, которое нацелено на ==, а затем на ##=##=## из-за замены, нацеленной на =.
Кроме того, ваш подход не гарантирует, что будет выбрана самая длинная совпадающая цель / игла, поэтому += заменяется на +#=#, а затем на #+##=#, прежде чем он даже достигнет цели +=.
Сложность этой функции равна O (k (n)), где k - количество замен, которые необходимо сделать. Вы можете сделать это за O (n), но вы должны переопределить этот метод или определить новую функцию и проверить строку слово за словом и заменить ее, если совпадение найдено в любом из вышеуказанных условий.