Регулярні вирази - відповідати будь-чому


278

Як зробити так, щоб вираз відповідав абсолютно будь-якому (включаючи пробіли)?
Приклад:

Регекс: Я купив _____ овець.

Матчі: я купив овець. Я купив овечку. Я купив п’ять овець.

Я спробував використовувати (.*), але це, здається, не працює.

Оновлення: я змусив його працювати, мабуть, проблема не була в регулярних виразах, це просто в тому, що (.) Символи були уникнуті.


27
.*повинен працювати. Чи можете ви вставити власний код?
Яків Яггерс

2
Якою мовою ви кодуєте?
Ziggy

9
крапка не збігається з новою
лінією

Відповіді:


293

Зазвичай крапка відповідає будь-якому символу, крім нових рядків .

Тож якщо .*це не працює, встановіть (або використовуйте (?s).*) опцію "крапка збігається з новими рядками" .

Якщо ви використовуєте JavaScript, який не має опції "dotall", спробуйте [\s\S]*. Це означає "відповідати будь-якій кількості символів, яка є або пробілом, або непробілом" - ефективно "відповідати будь-якій рядку".

Інший варіант, який працює лише для JavaScript (і не розпізнається жодним іншим ароматом регулярних виразів), [^]*який також відповідає будь-якій рядку. Але, [\s\S]*здається, він широко використовується, можливо, тому, що він більш портативний.


7
.*не відповідає, \nале він керує рядком, який містить лише те, \nщо відповідає 0 символам.
Toto

1
якщо ви використовуєте Javascript, не забудьте зменшити косу рису під час встановлення змінної цього шаблону, наприклад: var pattern = "[\\ s \\ S] *";
ведмідь Астра

ці (?s).*роботи для мене все , включаючи відповідність нової лінії
Гуджарат Santana

1
Є ПРОБЛЕМА з використанням / [\ s \ S] * /. Якщо ви використовуєте його у своєму коді, а потім коментуєте такий код, який викликає синтаксичну помилку, оскільки кінець шаблону вважається кінцем коментаря. Потім потрібно видалити цей шаблон із коментованого коду, щоб він працював. Але тоді, якщо ви коли-небудь знову його не коментувати, він більше не працюватиме, або не працюватиме так, як раніше, і повинен.
Логіка Пану

Це було б у випадку з будь-яким регулярним виразом, який закінчується зірочкою. Звичайно, цього легко уникнути, додавши щось після *(як у /.*(?:)/) або використовуючи конструктор регулярних виразів ( var foo = new RegExp(".*")).
Тім Піцкер

177

(.*?) відповідає чому завгодно - я його використовую роками.


61
але чи відповідає це новий рядок?
ineedahero

Я використовував це на Sublime Text, і він відмінно працював. Дякую! ("title":".*?")
SCabralO

8
У Javascript використовуйте [\s\S]*або [^]*.
Джефф Хуйсманс

Я не знаю, але кожен раз, коли я вживаю цей вираз, я відчуваю провину за те, що не висловлюю конкретного виразу для мого випадку використання. Якщо сказати, w+недостатньо, я закінчую використання .+. На щастя, ще не повернувся, щоб мене вкусити.
Тушар

Для мене працює Python
suffa

89

Виберіть & запам’ятати 1 з наступного !!! :)

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

Пояснення:

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

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

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

(Ви можете обміняти *на , +якщо ви хочете 1 або більше символів [замість 0 або більше]).




BONUS EDIT:

Якщо ви хочете зіставити все в одному рядку, ви можете скористатися цим:

[^\n]+

Пояснення:

^: ні

\n: рядок

+: для 1 символу чи більше



6

Використовуйте .*та переконайтеся, що ви використовуєте еквівалент однорядкових ваших реалізацій, щоб ви відповідали на закінчення рядків .

Тут є чудове пояснення -> http://www.regular-expressions.info/dot.html


4

Тому що .знайдіть один символ, за винятком нової лінії чи термінатора рядка.

Отже, щоб відповідати чому завгодно, Ви можете використовувати так: (.|\n)*?

Сподіваюся, це допомагає!


2

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

Спробуйте це:

([a]|[^a])

Цей регулярний вираз відповідає aабо anything else expect a. Абсолютно, це означає узгодити все.

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

Дякуємо @mpen за більш стислий спосіб.

[\s\S]

1
Найпоширеніший спосіб зробити це в JS [\s\S]- тобто співпадіння просторів і непробілів.
mpen

2

Для JavaScript найкращою та найпростішою відповіддю, здавалося б, /.*/.

Як пропонують інші /(.*?)/ працюватиме також добре, але /.*/ простіше. () Всередині візерунка не потрібні, наскільки я бачу, ні закінчення? відповідати абсолютно будь-чому (включаючи порожні рядки)

НЕ РІШЕННЯ:

/ [\ s \ S] / НЕ відповідає порожнім рядкам, тому це не є рішенням.

/ [\ s \ S] * / Чи відповідає також порожнім рядкам. Але у нього є проблема: якщо ви використовуєте його у своєму коді, ви не можете коментувати такий код, оскільки "* /" інтерпретується як кінець коментаря.

/ ([\ s \ S] *) / працює і не має проблеми з коментарями. Але зрозуміти це довше і складніше, ніж /.*/.


До речі. здається, що наведені вище кодові витримки змушують переповнювати стек частинами моєї відповіді курсивом, це не було моїм наміром.
Логіка Пану

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", ви отримаєте ВСЕ.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.