Преобразуйте regex positive lookbehind в другой формат [duplicate]

Swift 3 Просто используйте «[]» с параметром загрузки изображения, чтобы сделать его массивом изображений.

Alamofire.upload(multipartFormData: { multipartFormData in
            // import image to request
            for imageData in imagesData {
                multipartFormData.append(imageData, withName: "\(imageParamName)[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg")
            }
            for (key, value) in parameters {
                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
            }
        }, to: urlString,

            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in

                    }
                case .failure(let error):
                    print(error)
                }

        })
23
задан codaddict 25 August 2010 в 19:41
поделиться

7 ответов

Утверждения Lookbehind были недавно завершены для JavaScript и будут опубликованы в следующей публикации спецификации ECMA-262. Они поддерживаются в Chrome 66 (Opera 53), но других основных браузеров на момент написания.

var str = 'Text:"How secure is my information?"',
    reg = /(?<=Text:")[^"]+(?=")/;

str.match(reg)[0];
// -> How secure is my information?

Старые браузеры не поддерживают lookbehind в регулярном выражении JavaScript. Вы должны использовать скобку для выражений, подобных этой:

var str = 'Text:"How secure is my information?"',
    reg = /Text:"([^"]+)"/;

str.match(reg)[1];
// -> How secure is my information?

Однако это не будет охватывать все случаи использования утверждения lookbehind.

40
ответ дан Andy E 22 August 2018 в 01:35
поделиться
  • 1
    Но как извлечь все такие данные из большого документа? Скажите в массив или что-то еще? – Raj 25 August 2010 в 20:00
  • 2
    Гектометр Я получаю неопределенное значение, когда проверяю приведенный выше код. Когда я консолью str.match(reg) без индекса 1, он выводит мысли ["Text:"How secure is my information?""]? – jmk2142 19 June 2013 в 15:42
  • 3
    @orangewarp: модификатор g необходимо удалить для примера в моем ответе. – Andy E 19 June 2013 в 15:50
  • 4
    Круто. Работает. Почему модификатор g убивает скобки-скобки? Мне было интересно, потому что я могу представить сценарий, в котором у вас может быть несколько целей в строке. str = 'Something <id="12345"> more things <id="qwerty>" ...' Если мне нужны все значения id в массиве, кажется, вы захотите использовать g , но тогда скопирующие скобки исчезнут. Что было бы лучше всего здесь? reg = /id="([^"]+)"/g; - & gt; [& lt; id = "12345", "id =" qwerty "& quot;] - & gt; затем запустите foreach с /id="([^"]+)"/? Можно ли это сделать одним шагом регулярного выражения? – jmk2142 19 June 2013 в 16:55
  • 5
    @orangewarp: это стандартное поведение для соответствия глобальному флагом. Он в основном повторяет вызов exec за кулисами, возвращая только первый элемент из массива результатов на каждой итерации. Лучшее решение, вероятно, состоит в том, чтобы запустить собственный цикл, вызвав RegExp.prototype.exec и самостоятельно разобрать результат или использовать поиск и не заменять метод (оба из них более или менее одинаковы, но последнее в некоторых случаях дает немного больше удобства). – Andy E 20 June 2013 в 08:45

Если вы хотите избежать регулярного выражения все вместе, вы можете сделать:

var texts = file.split('Text:"').slice(1).map(function (text) {
  return text.slice(0, text.lastIndexOf('"')); 
});
2
ответ дан Bill Criswell 22 August 2018 в 01:35
поделиться

Вы можете просто сделать:

/Text:"(.*?)"/

Объяснение:

  • Text:": для соответствия буквально
  • .*?: To (g2) (): Чтобы зафиксировать совпадение
  • ": для соответствия литералу "
  • / / : разделители
11
ответ дан codaddict 22 August 2018 в 01:35
поделиться
  • 1
    Как вы это используете? У вас есть какой-то контекст? – Sjoerd 25 August 2010 в 19:39
  • 2
    это регулярное выражение, вы должны использовать его, например, .match () – Crayon Violent 25 August 2010 в 23:56
string.match(/Text:"([^"]*)"/g)
2
ответ дан Crayon Violent 22 August 2018 в 01:35
поделиться
  • 1
    Как избежать соответствия текста: в результате? – Raj 25 August 2010 в 20:30
  • 2
    string [0] всегда будет иметь полное совпадение регулярных выражений. строка [1] будет иметь захваченный текст. Если в регулярном выражении есть второй захват (скобки), он будет помещен в строку [2] и т. Д. – Crayon Violent 25 August 2010 в 20:59
  • 3
    Я думаю, с флагом / g вы получите только полное соответствие регулярному выражению для всех матчей. – Raj 25 August 2010 в 22:16
  • 4
    Модификатор g будет искать все на странице, которая соответствует, а не просто останавливается при первом совпадении. Вы сказали, что у вас есть строки (множественное число), поэтому я поместил там модификатор / g. – Crayon Violent 25 August 2010 в 23:54

Я просто хочу добавить что-то: JavaScript не поддерживает lookbehinds как (?<= ) или (?<! ).

Но он поддерживает lookaheads, такие как (?= ) или (?! ).

16
ответ дан Eddy 22 August 2018 в 01:35
поделиться

Вот пример, показывающий, как вы можете это сделать.

1) Учитывая эту входную строку:

const inputText = 
`Text:"How secure is my information?"someRandomTextHere
Voice:"Not very much"
Text:"How to improve this?"
Voice:"Don't use '123456' for your password"
Text:"OK just like in the "Hackers" movie."`;

2) Извлечь данные в двойные кавычки после литерала Text:, так что результаты представляют собой массив со всеми подобными совпадениями:

["How secure is my information?",
 "How to improve this?",
 "OK just like in the \"Hackers\" movie."]

РЕШЕНИЕ

function getText(text) {
  return text
    .match(/Text:".*"/g)
    .map(item => item.match(/^Text:"(.*)"/)[1]);
}

console.log(JSON.stringify(    getText(inputText)    ));

RUN SNIPPET ДЛЯ ВИДЕНИЯ РАБОЧЕЙ ДЕМО

const inputText = 
`Text:"How secure is my information?"someRandomTextHere
Voice:"Not very much"
Text:"How to improve this?"
Voice:"Don't use '123456' for your password"
Text:"OK just like in the "Hackers" movie."`;



function getText(text) {
  return text
    .match(/Text:".*"/g)
    .map(item => item.match(/^Text:"(.*)"/)[1]);
}

console.log(JSON.stringify(    getText(inputText)    ));

1
ответ дан Piotr Berebecki 22 August 2018 в 01:35
поделиться
<script type="text/javascript">
var str = 'Text:"How secure is my information?"';
var obj = eval('({'+str+'})')
console.log(obj.Text);
</script>
2
ответ дан Sjoerd 22 August 2018 в 01:35
поделиться
  • 1
    Современные браузеры также имеют JSON.parse , что может быть предпочтительнее eval. – Sjoerd 20 June 2012 в 13:39
Другие вопросы по тегам:

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