Неожиданный идентификатор RegExp Javascript IE [дубликат]

Я также получил указанную вами ошибку:

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

В моем случае это было связано с наличием файлов C ++ с расширением .cc.

Если CMake не может правильно определите язык кода, вы можете использовать следующее:

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

Принятый ответ, предполагающий добавление языка в оператор project(), просто добавляет более строгую проверку того, какой язык используется (согласно документация), но мне это не помогло:

При желании вы можете указать, какие языки поддерживает ваш проект. Например, языки CXX (например, C ++), C, Fortran и т. Д. По умолчанию C и CXX включены. Например. если у вас нет компилятора C ++, вы можете отключить проверку для него, явно указав языки, которые хотите поддерживать, например. C. При использовании специального языка «NONE» все проверки для любого языка могут быть отключены. Если существует переменная, которая называется CMAKE_PROJECT__INCLUDE_FILE, файл, на который указывает эта переменная, будет включен в качестве последнего шага команды проекта.

112
задан Memor-X 7 April 2017 в 05:49
поделиться

8 ответов

Элемент lookahead (часть (?=) не потребляет никакого ввода. Это утверждение с нулевой шириной (как и граничные проверки и lookbehinds).

Вы хотите регулярное совпадение здесь, чтобы потреблять часть cow. Чтобы захватить фрагмент между ними, вы используете группу захвата (просто поместите часть паттерна, которую вы хотите захватить в скобках):

cow(.*)milk

Никакие образы не нужны вообще.

129
ответ дан R. Martinho Fernandes 15 August 2018 в 13:16
поделиться
  • 1
    Oi! Было бы здорово, если бы вы были в pt.stackoverflow.com (vou apagar isto já já) :) – Sergio 2 January 2015 в 16:47
  • 2
    Когда я проверяю это, предоставленное выражение Regex включает в себя как «коровы», и "молоко" ... – TheCascadian 27 April 2018 в 03:39
  • 3
    Этого не хватает. Когда вы получите результат совпадения, вам нужно извлечь совпадающий текст первой группы захвата с matched[1], а не весь текст с согласованием с matched[0]. – Rory O'Kane 20 June 2018 в 20:57

Выбранный ответ не помог мне ... хмм ...

Просто добавьте пробел после коровы и / или перед молоком, чтобы обрезать пробелы из «всегда дает»

/(?<=cow ).*(?= milk)/

-1
ответ дан duduwe 15 August 2018 в 13:16
поделиться

Вот регулярное выражение, которое захватит то, что находится между коровой и молоком (без ведущего / конечного пространства):

srctext = "My cow always gives milk."; var re = /(.*cow\s+)(.*)(\s+milk.*)/; var newtext = srctext.replace(re, "$2");

Пример: http://jsfiddle.net/entropo/tkP74/

43
ответ дан entropo 15 August 2018 в 13:16
поделиться
Вам нужно захватить .*. Вы можете (но не обязательно) сделать .* nongreedy. На самом деле нет необходимости в поиске. > /cow(.*?)milk/i.exec('My cow always gives milk'); ["cow always gives milk", " always gives "]
11
ответ дан Matt Ball 15 August 2018 в 13:16
поделиться
  • 1
    В этом конкретном случае, если бы он был жадным, он достиг бы конца и назад (предположительно). – Ben 12 April 2011 в 23:24

Как насчет использования следующего регулярного выражения:

(?<=My cow\s).*?(?=\smilk)
2
ответ дан Paul Stenne 15 August 2018 в 13:16
поделиться

Я смог получить то, что мне нужно, используя решение Martinho Fernandes ниже. Код:

var test = "My cow always gives milk"; var testRE = test.match("cow(.*)milk"); alert(testRE[1]);

Вы заметите, что я предупреждаю переменную testRE как массив. Это связано с тем, что по какой-то причине testRE возвращается как массив. Выход из:

My cow always gives milk

Изменяется на:

always gives
3
ответ дан Radiodef 15 August 2018 в 13:16
поделиться

Метод match () ищет строку для соответствия и возвращает объект Array.

// Original string var str = "My cow always gives milk"; // Using index [0] would return<br/> // "**cow always gives milk**" str.match(/cow(.*)milk/)**[0]** // Using index **[1]** would return // "**always gives**" str.match(/cow(.*)milk/)[1]
-1
ответ дан TylerH 15 August 2018 в 13:16
поделиться
Регулярное выражение, чтобы получить строку между двумя строками в Javascript

. Наиболее полное решение, которое будет работать в подавляющем большинстве случаев, - это использование группы захвата с шаблоном совпадения ленивых точек. Однако точка . в регулярном выражении JS не соответствует символам разрыва строки, поэтому в 100% случаях будет работать конструкция [^] или [\s\S] / [\d\D] / [\w\W].

ECMAScript 2018 и более новое совместимое решение

В средах JS, поддерживающих ECMAScript 2018, модификатор s позволяет . соответствовать любому символу, включая символы разрыва строки, а механизм регулярных выражений поддерживает lookbehinds переменной длины. Таким образом, вы можете использовать регулярное выражение, подобное

var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any // Or var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional

. В обоих случаях текущая позиция проверяется на cow с любыми пробелами 1/0 или более после cow, тогда любые символы 0+ как (= добавлено к значению совпадения), а затем milk проверяется (с любыми пробелами 1/0 или более перед этой подстрокой).

Сценарий 1: линейный вход

группа захвата

cow (.*?) milk

cow находится сначала, затем пробел, затем любые символы 0+, отличные от символов разрыва строки, как можно меньше, поскольку *? является ленивым квантификатором, захватываются в группу 1, а затем следует пробел с milk (и они совпадают и ECMAScript 2018 тоже).

Сценарий 2. Многострочный вход

cow ([\s\S]*?) milk

Здесь сначала будут сопоставлены cow и пробел, а любые символы 0+ как можно меньше сопоставляются и записываются в группу 1, а затем пробел с milk сопоставлен.

Сценарий 3: Перекрытие совпадений

Если у вас есть строка типа >>>15 text>>>67 text2>>>, и вам нужно получить 2 мата hes между >>> + number + whitespace и >>>, вы не можете использовать />>>\d+\s(.*?)>>>/g, так как это будет только найти 1 совпадение из-за того, что >>> до 67 уже потребляется при поиске первого матча. Вы можете использовать позитивный просмотр, чтобы проверить наличие текста, фактически не «сжимая» его (то есть добавляя к совпадению):

/>>>\d+\s(.*?)(?=>>>)/g

См. [D19] />>>\d+\s(.*?)>>>/g , уступая text1 и text2 в качестве содержимого группы 1.

Также см. Как получить все возможные совпадающие совпадения для строки.

Показатели производительности

Lazy dot (.*?) внутри шаблонов регулярных выражений может замедлить выполнение скрипта, если задан очень длинный ввод. Во многих случаях Как получить все возможные совпадающие совпадения для строки помогает в большей степени. Попытка захватить все между cow и milk из "Their\ncow\ngives\nmore\nmilk", мы видим, что нам просто нужно сопоставить все строки, которые не начинаются с milk, поэтому вместо положительного lookahead мы может использовать:

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm

См. демонстрацию regex (если может быть \r\n, используйте /cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm). С этой небольшой тестовой строкой усиление производительности незначительно, но с очень большим текстом вы почувствуете разницу (особенно если линии длинны, а разрывы строк не очень многочисленны).

Пример использования регулярных выражений в JavaScript:

Регулярное выражение для получения строки между двумя строками в Javascript

37
ответ дан Wiktor Stribiżew 15 August 2018 в 13:16
поделиться
Другие вопросы по тегам:

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