Как использовать флаг dotall для regex.exec()

Я хочу получить строку в многострочной строке, которая содержит какой-либо конкретный символ, и я хочу получить между двумя конкретными взглядами.

Я использовал это регулярное выражение и эту работу, но если контент имеет какой-либо символ (\ r\n\t), он не работает и получает нулевое значение.

This Wotked
    var regex = new RegExp("\-{2}Head(.*)-{2}\/\Head");      
    var content = "--Head any Code and String --/Head";
    var match = regex.exec(content);

Это не работает

var regex = new RegExp("\-{2}Head(.*)-{2}\/\Head");      
var content = "--Head \n any Code \n and String --/Head";
var match = regex.exec(content);

Я нашел regexer (http://www.regexr.com/v1/) и знаю, что я должен использовать Dotall для многострочной строки, но я не могу использовать dotall для regex.exec

спасибо.

Ответ 1

javascript не поддерживает модификатор s (dotall). Единственным обходным решением является использование класса "catch all", например [\s\S] вместо точки:

regex = new RegExp("\-{2}Head([\\s\\S]*)-{2}\/\Head")

Также обратите внимание, что ваше выражение может быть написано более сжато, используя литерал:

regex = /--Head([\s\S]*)--\/Head/

Ответ 2

На самом деле, Конструкция регулярного выражения JS native-all-characters

[^]

Это означает, что соответствует любому символу, который не является ничем. Другие ароматы регулярных выражений вызывают предупреждение или исключение из-за неполного символьного класса (demo), хотя он будет полностью применим для JavaScript (демонстрация).

По правде говоря, [^] не переносится и, следовательно, не рекомендуется, если вы не хотите, чтобы ваш код работал только на JS.

regex = /--Head([^]*)--\/Head/

Чтобы иметь тот же шаблон, сопоставляющий любые символы в JS и, скажем, Java, вам нужно использовать обходной путь, проиллюстрированный в других ответах: используйте класс символов с двумя противоположными сокращенными символьными классами, когда переносимость является ключевым: [\w\W], [\d\D], [\s\S] (наиболее часто используется).

ЗАМЕЧАНИЕ, что [^] короче.

Ответ 3

Использовать catch all character class [\s\S], что означает пробел или не пространство

var regex = new RegExp("\-{2}Head([\s\S]*)-{2}\/\Head","m");      
var content = "--Head \n any Code \n and String --/Head";
var match = regex.exec(content);

Ответ 4

Вы ищете модификатор s, также известный как модификатор dotall, который заставляет точку . также соответствовать символам новой строки. Модификатор dotall не существует в . Обходной путь заменяет точку . на...

[\S\s]*

Ваше регулярное выражение будет выглядеть так.

var regex = /-{2}Head([\S\s]*)-{2}\/Head/