Как использовать флаг 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 не существует в javascript. Обходной путь заменяет точку .
на...
[\S\s]*
Ваше регулярное выражение будет выглядеть так.
var regex = /-{2}Head([\S\s]*)-{2}\/Head/