Подход, ищущий те же элементы, что и у нового элемента, подсчитывающий и проверяющий в соответствии с требуемым максимумом и подталкивающий либо к фактическому индексу (если счет меньше), либо к следующему элементу (если в начале или больше, чем требуемый счет) ).
этот подход берет массив с элементами и добавляет каждый элемент, ища ситуацию container
.
function addFruit(fruit) {
const
addFruits = (s, v) => s + +(v === fruit),
max = { apple: 3, mango: 2, stawberry: 4, default: Infinity };
var i = 0;
while (i < container.length) {
if (container[i].reduce(addFruits, 0) < (max[fruit] || max.default)) break;
i++;
}
container[i] = container[i] || [];
container[i].push(fruit);
}
var data = ["apple", "apple", "mango", "stawberry", "banana", "mango", "stawberry", "banana", "apple", "apple", "stawberry", "banana", "apple", "mango", "stawberry", "stawberry", "stawberry", "banana", "stawberry"],
container = [];
data.forEach(addFruit);
console.log(container);
.as-console-wrapper { max-height: 100% !important; top: 0; }
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");
import java.util.regex.PatternSyntaxException;
// (:?\d+) \* x\^(:?\d+)
//
// Options: ^ and $ match at line breaks
//
// Match the regular expression below and capture its match into backreference number 1 «(:?\d+)»
// Match the character “:” literally «:?»
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
// Match a single digit 0..9 «\d+»
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Match the character “ ” literally « »
// Match the character “*” literally «\*»
// Match the characters “ x” literally « x»
// Match the character “^” literally «\^»
// Match the regular expression below and capture its match into backreference number 2 «(:?\d+)»
// Match the character “:” literally «:?»
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
// Match a single digit 0..9 «\d+»
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
try {
String resultString = subjectString.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
// Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
// Non-existent backreference used the replacement text
}
Если это будет для какого-либо общего математического выражения, и вводные выражения позволяются, то будет очень трудно (возможно, невозможный) сделать это с регулярными выражениями.
, Если единственные замены - те, Вы показали, дело не в этом трудно, чтобы сделать. Сначала разделите *
, тогда используйте получение, любят, Может Болван, которого GГјder показал для обработки ^
.
Каков Ваш многочлен? Если бы Вы "обрабатываете" его, я предполагаю своего рода дерево подвыражений, сгенерированных в какой-то момент, и думал бы, что будет намного более просто использовать это для генерации строки, чем повторно проанализировать необработанное выражение с regex.
Просто бросок другого образа мыслей там. Я не уверен, что еще продолжается в Вашем приложении.
Вы захотите изучить получение в regex для обработки обертывания 3 в ^3.
Попробуйте это:
String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\\^(\\d+)", "<sup>\$1</sup>");
убедиться импортировать java.util.regex.