Преобразование Regex из PHP в JavaScript [дубликат]

Эта «ошибка» дала мне много часов работы сверхурочных! Но я начинаю видеть его потенциальное использование (но мне хотелось бы, чтобы это было во время выполнения, все еще)

Я дам вам то, что я вижу в качестве полезного примера.

def example(errors=[]):
    # statements
    # Something went wrong
    mistake = True
    if mistake:
        tryToFixIt(errors)
        # Didn't work.. let's try again
        tryToFixItAnotherway(errors)
        # This time it worked
    return errors

def tryToFixIt(err):
    err.append('Attempt to fix it')

def tryToFixItAnotherway(err):
    err.append('Attempt to fix it by another way')

def main():
    for item in range(2):
        errors = example()
    print '\n'.join(errors)

main()

печатает следующие

Attempt to fix it
Attempt to fix it by another way
Attempt to fix it
Attempt to fix it by another way
7
задан J4N 15 September 2011 в 09:12
поделиться

1 ответ

Используйте литерал regex [MDN] :

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;

Вы делаете две ошибки, когда используете RegExp [MDN] :

  • «Разделители» / не должны быть частью выражения
  • . Если вы определяете выражение как строку, вам нужно избежать обратного слэша, потому что это escape-символ в строках

Кроме того, модификаторы передаются как второй аргумент функции.

Итак, если вы хотите использовать RegExp (который вы не используете в этом случае), эквивалент был бы следующим:

var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g");

(и теперь я понял, почему регулярные выражения являются более удобными)


Я всегда нахожу его полезно скопировать и пропустить выражение RegExp в консоли и посмотреть его вывод. Принимая ваше исходное выражение, получаем:

/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g

, что означает, что выражения пытаются сопоставить /, s и g буквально, а parens () по-прежнему рассматриваются как специальные символы .


Обновление: .match() возвращает массив:

["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]

, который, кажется, не очень полезен.

Вы должны использовать .exec() [MDN] для извлечения чисел:

["(25.774252, -80.190262)", "25.774252", "-80.190262"]

Это нужно вызывать до тех пор, пока все строки не будут обрабатывается.

Пример:

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
var result, points = [];

while((result = reg.exec(polygons)) !== null) {
    points.push([+result[1], +result[2]]);
}

Это создает массив массивов, а унарный плюс (+) преобразует строки в числа:

[
    [25.774252, -80.190262], 
    [18.466465, -66.118292], 
    ...
]

Конечно, если вы хотите, чтобы значения как строки, а не как числа, вы можете просто опустить +.

14
ответ дан Felix Kling 21 August 2018 в 07:52
поделиться
  • 1
    Отлично, это сработало! Я не знал этого синтаксиса. Небольшой вопрос: я получаю массив с результатом, но как я могу получить содержимое моего захвата & quot; (...) & quot; ? (это: ([0-9 .-] +)) – J4N 15 September 2011 в 09:27
  • 2
    См. Мое обновление. – Felix Kling 15 September 2011 в 09:32
  • 3
    большое спасибо, что мне нужно – J4N 15 September 2011 в 09:36
  • 4
    Я сделал ошибку, вы должны сохранить модификатор g. Вам просто нужно использовать exec. См. Исправленную версию. – Felix Kling 15 September 2011 в 09:41
  • 5
    Хотя это довольно старый ответ, это помогло мне заполнить мою проверку. Дополнительный '\' в '\. «сделал это в конце :) – Beeelze 5 June 2015 в 08:14
Другие вопросы по тегам:

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