2015-03-05 4 views
2

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

### 
some content 
that I need to match 
and might have some special character in it such as | <> [] 
### 

Я пытаюсь получить содержимое между хэш. Я попытался использовать регулярное выражение, но оно не соответствует ему и возвращает значение null.

var regex = /### ((.|\n)*) ###/; 
var match= regex.exec(aboveContentAsString); 
console.log(match[1]); 
+2

вынуть пробелы в регулярном выражении – Les

+0

'### (' пытается сопоставить '###', за которым следует пробел. Однако в вашем текстовом тексте '###' следует разрыв строки, поэтому нет Почему у вас есть пробелы в выражении? –

ответ

5

JavaScript отсутствует (/ dotall SingleLine) опцию регулярных выражений s, но вы можете обойти его, заменив . с [\s\S] (любой символ, который является пробел или что это не пробел, который в основном означает, что соответствует всем) , Кроме того, сделать свой квантор ленивым и избавиться от пробелов в структуре, так как там также нет x (расширенного) варианта в JS:

var regex = /###([\s\S]*?)###/; 

Пример:

var input = "###\nsome content\nthat I need to match\nand might have some special character in it such as | <> []\n###"; 
 

 
var regex = /###([\s\S]*?)###/; 
 
document.getElementById("output").innerText = regex.exec(input)[1];
<pre id="output"></pre>

Ваш оригинальный подход мог бы сработать, но я добавил бы также \r:

var regex = /###((?:.|[\r\n])*?)###/; 

Но я предпочитаю подход [\s\S], так как он короче и (IMHO) более читабельным.

+1

Sidenode: Может быть любой отдельной парой, например '[\ d \ D]', '[\ w \ W]' или даже '[^]' (** все, но ничего **) :-) – dognose

+1

@dognose будьте осторожны с '[^]' - Я рекомендую против него, так как он «работает» только в JS и не является стандартным синтаксисом regex: в других вариантах '' 'будет интерпретироваться как '\]', и класс символов будет уничтожен (синтаксическая ошибка). –

+0

Youre право. Regex Hint # 25566 записано: P – dognose

0

Javascript не имеет Dot-Matches-All-Option - поэтому просто используйте: dot ИЛИ пробелы. (Первый \s*, чтобы убедиться, что ваш матч не начинается с LineBreak. - не обязательное OFC)

^###\s*((?:.|\s)*)###$ 

Regular expression visualization

Debuggex Demo

0

Если вы хотите, чтобы регулярное выражение не соответствует трем хэшей, попробуйте что-то вроде этого:
(?![###])[^#]((.|\s)[^#])*. Это использует отрицательный lookbehind для начала сопоставления только тогда, когда он не может соответствовать ###. Он начинает сопоставляться и продолжается до тех пор, пока не ударит другой хеш.

Смежные вопросы