Регулярные выражения - сопоставьте что угодно

281

Как мне сделать выражение, чтобы соответствовать абсолютно всему (включая пробелы)?
Пример:

Regex: я купил _____ овец.

Спички: я купил овец. Я купил овцу. Я купил пять овец.

Я пытался использовать (.*), но это не похоже на работу.

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

ходунки
источник
27
.*должно сработать. Можете ли вы вставить свой фактический код?
Джейкоб Эггерс
2
На каком языке вы кодируете?
Зигги
9
точка не будет соответствовать новой строке
Zee

Ответы:

294

Обычно точка соответствует любому символу, кроме символов новой строки .

Так что, если .*не работает, установите опцию «точка соответствует символу новой строки тоже» (или используйте (?s).*).

Если вы используете JavaScript, у которого нет опции "dotall", попробуйте [\s\S]*. Это означает «соответствовать любому количеству символов, которые являются пробельными или непробельными символами» - фактически «соответствовать любой строке».

Другой вариант, который работает только для JavaScript (и не распознается любым другим видом регулярного выражения), - [^]*это также соответствие любой строке. Но, [\s\S]*кажется, более широко используется, возможно, потому что это более портативно.

Тим Питцкер
источник
7
.*не соответствует, \nно соответствует строке, которая содержит только \nпотому, что соответствует 0 символов.
Тото
1
при использовании Javascript не забудьте косую черту при установке переменной для этого шаблона, например: var pattern = "[\\ s \\ S] *";
Astra Bear
эти (?s).*работы для меня все , включая соответствие новой линии
Гуджарат Santana
1
Есть ПРОБЛЕМА с использованием / [\ s \ S] * /. Если вы используете его в своем коде, а затем закомментируете такой код, который вызывает синтаксическую ошибку, потому что конец паттерна означает конец комментария. Затем вам нужно удалить этот шаблон из закомментированного кода, чтобы он работал. Но затем, если вы когда-нибудь снова откомментируете это, оно больше не будет работать или работать не так, как раньше, и должно.
Panu Logic
Это было бы в случае любого регулярного выражения, заканчивающегося звездочкой. Конечно, этого легко избежать, добавив что-то после *(как в /.*(?:)/) или используя конструктор regex ( var foo = new RegExp(".*")).
Тим Пицкер
177

(.*?) соответствует чему угодно - я использую это в течение многих лет.

jdixon2614
источник
61
но соответствует ли это новой строке?
Inedahero
Я использовал это на Sublime Text, и он работал отлично. Спасибо! ("title":".*?")
SCabralO
8
В Javascript используйте [\s\S]*или [^]*.
Джефф Хейсманс
Я не знаю, но каждый раз, когда я использую это выражение, я чувствую себя виноватым из-за того, что я не сделал конкретного выражения для моего варианта использования. Если сказать, w+не достаточно, я в конечном итоге использовать .+. К счастью, еще не вернулся, чтобы укусить меня.
Tushar
Работы для меня с помощью Python
Suffa
90

Выберите и запомните 1 из следующих! :)

[\s\S]*
[\w\W]*
[\d\D]*

Объяснение:

\s: пробел \S: не пробел

\w: слово \W: не слово

\d: цифра \D: не цифра

(Вы можете обменять *на, +если вы хотите 1 или более символов [вместо 0 или более]).




БОНУС РЕДАКТИРОВАТЬ:

Если вы хотите сопоставить все в одной строке, вы можете использовать это:

[^\n]+

Объяснение:

^: не

\n: Разрыв строки

+: для 1 символа или более

Тайлер
источник
21

Попробуй это:

I bought (.* )?sheep

или даже

I bought .*sheep
Майк Можаев
источник
6

Используйте .*и убедитесь, что вы используете в своих реализациях эквивалент одной строки, чтобы совпадать с окончаниями строки .

Здесь есть отличное объяснение -> http://www.regular-expressions.info/dot.html

мистифицировать
источник
4

Потому что .найти один символ, кроме новой строки или конца строки.

Итак, чтобы соответствовать чему-либо, вы можете использовать так: (.|\n)*?

Надеюсь, поможет!

Санг Хуинх
источник
2

(.*?)не работает для меня. Я пытаюсь сопоставить комментарии в окружении /* */, которые могут содержать несколько строк.

Попробуй это:

([a]|[^a])

Это регулярное выражение соответствует aили anything else expect a. Абсолютно, это означает соответствие всему.

Кстати, в моей ситуации, /\*([a]|[^a])*/соответствует комментариям в стиле C.

Спасибо @mpen за более сжатый способ.

[\s\S]
oryxfea
источник
1
Наиболее распространенный способ сделать это в JS [\s\S]- это сопоставление пробелов и непространств.
mpen
2

Для JavaScript лучшим и простым ответом будет /.*/.

Как подсказывают другие, /(.*?)/ тоже подойдет, но /.*/ проще. () Внутри шаблона не нужны, насколько я вижу, ни окончание? соответствовать абсолютно всему (включая пустые строки)

NON-РЕШЕНИЯ:

/ [\ s \ S] / НЕ соответствует пустым строкам, поэтому это не решение.

/ [\ s \ S] * / Соответствует также пустым строкам. Но у него есть проблема: если вы используете его в своем коде, вы не можете закомментировать такой код, потому что '* /' интерпретируется как конец комментария.

/ ([\ s \ S] *) / работает и не имеет проблемы с комментариями. Но это длиннее и сложнее для понимания, чем /.*/.

Panu Logic
источник
КСТАТИ. кажется, что приведенные выше выдержки из кода заставляют Stack Overflow отображать части моего ответа курсивом, что не было моей целью.
Panu Logic
1

Если вы используете JavaScript, ES2018 добавил флаг s (dotAll). С sфлагом точка .будет соответствовать любым символам, включая переводы строки.

console.log("line_1\nline_2".match(/.+/s))

Примечание : пока не поддерживается некоторыми браузерами.

Куонг Ле Нгок
источник
1

В спецификации 2018 предусмотрен флаг s (псевдоним: dotAll), который .будет соответствовать любому символу, включая разрывы строк :

const regExAll = /.*/s; //notice the 's'

let str = `
Everything
	in 	this
			string
					will
						be
	matched. Including whitespace (even Linebreaks).
`;

console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));

let newStr = str.replace(regExAll,"🐔");
console.log(`Replaced with:`,newStr); //Index: 0

Код выше работает в Chrome, но sфлаг еще не реализован в Firefox, но это будет в ближайшее время .

Лонни Бест
источник
0

Я рекомендую использовать /(?=.*...)/g

пример

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true

const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true

const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true

const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

Используйте regex101 для тестирования

Алекс Монтойя
источник
0

Честно говоря, многие ответы устарели, поэтому я обнаружил, что если вы просто протестируете любую строку независимо от содержимого символа с помощью «/.*/i», то получите ВСЕ.

kjohnsonthecoder
источник