JavaScript - возвращаемая строка между квадратными скобками

Я имею на самом деле просто, недавно записал эту функциональность в один из моих проектов.

void Battle::CheckSensorRange(Unit* unit,bool fog){
    int sensorRange = 0;
    for(int i=0; i < unit->GetSensorSlots(); i++){
        if(unit->GetSensorSlot(i)->GetSlotEmpty() == false){
            sensorRange += unit->GetSensorSlot(i)->GetSensor()->GetRange()+1;
        }
    }
    int originX = unit->GetUnitX();
    int originY = unit->GetUnitY();

    float lineLength;
    vector <Place> maxCircle;

    //get a circle around the unit
    for(int i = originX - sensorRange; i < originX + sensorRange; i++){
        if(i < 0){
            continue;
        }
        for(int j = originY - sensorRange; j < originY + sensorRange; j++){
            if(j < 0){
                continue;
            }
            lineLength = sqrt( (float)((originX - i)*(originX - i)) + (float)((originY - j)*(originY - j)));
            if(lineLength < (float)sensorRange){
                Place tmp;
                tmp.x = i;
                tmp.y = j;
                maxCircle.push_back(tmp);
            }
        }
    }

    //if we're supposed to fog everything we don't have to do any fancy calculations
    if(fog){
        for(int circleI = 0; circleI < (int) maxCircle.size(); circleI++){
            Map->GetGrid(maxCircle[circleI].x,maxCircle[circleI].y)->SetFog(fog);
        }
    }else{

        bool LOSCheck = true;
        vector <bool> placeCheck;

        //have to check all of the tiles to begin with 
        for(int circleI = 0; circleI < (int) maxCircle.size(); circleI++){
            placeCheck.push_back(true);
        }

        //for all tiles in the circle, check LOS
        for(int circleI = 0; circleI < (int) maxCircle.size(); circleI++){
            vector<Place> lineTiles;
            lineTiles = line(originX, originY, maxCircle[circleI].x, maxCircle[circleI].y);

            //check each tile in the line for LOS
            for(int lineI = 0; lineI < (int) lineTiles.size(); lineI++){
                if(false == CheckPlaceLOS(lineTiles[lineI], unit)){
                    LOSCheck = false;

                    //mark this tile not to be checked again
                    placeCheck[circleI] = false;
                }
                if(false == LOSCheck){
                    break;
                }
            }

            if(LOSCheck){
                Map->GetGrid(maxCircle[circleI].x,maxCircle[circleI].y)->SetFog(fog);
            }else{
                LOSCheck = true;
            }
        }
    }

}

существует некоторый дополнительный материал там, что Вам не было бы нужно при адаптации его к собственному использованию. Место типа просто определяется как положение X и Y для пользы удобств.

функция строки взята из Википедии с очень маленькими модификациями. Вместо того, чтобы распечатать x y координирует, я изменил его для возврата вектора места со всеми точками в строке. Функция CheckPlaceLOS просто возвращает TRUE или FALSE на основе того, если мозаика имеет объект на нем. Существует еще некоторая оптимизация, которая могла быть сделана с этим, но это хорошо для моих потребностей.

34
задан BrynJ 29 September 2009 в 14:47
поделиться

4 ответа

Использовать группировку. Я добавил ? , чтобы сделать сопоставление «нелицеприятным», так как это, вероятно, то, что вы хотите.

var matches = mystring.match(/\[(.*?)\]/);

if (matches) {
    var submatch = matches[1];
}
89
ответ дан 27 November 2019 в 16:04
поделиться

Поскольку javascript не поддерживает захват, вы должны обойти его. Рассмотрим эту альтернативу, использующую противоположный подход. Скорее это фиксирует то, что находится внутри скобок, удаляет то, что находится за ними. Поскольку всегда будет только один набор скобок, он должен работать нормально. Я обычно использую этот метод для удаления начальных и конечных пробелов.

mystring.replace( /(^.*\[|\].*$)/g, '' );
13
ответ дан 27 November 2019 в 16:04
поделиться

Вы пытались захватить скобки:

("\\[(.*)]");

Это должно вернуть шаблон в пределах скобки как зафиксированное совпадение в возвращенном массиве

4
ответ дан 27 November 2019 в 16:04
поделиться

Вы не можете. Javascript не поддерживает поиск назад.

Вам придется либо использовать группу захвата, либо обрезать скобки.

Кстати, вам, вероятно, не нужен жадный . * в ваше регулярное выражение. Попробуйте следующее:

"\\[.*?]"

Или лучше, это:

"\\[[^\\]]*]"
1
ответ дан 27 November 2019 в 16:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: