За 30 минут вы поймете, что такое регулярные выражения, и получите некоторые базовые знания, которые позволят вам использовать их в своих программах или на веб-страницах.
Введение в регулярные выражения за 30 минут Цель данной статьи Как использовать этот учебник Что такое регулярное выражение? Введение Тестирование регулярных выражений метасимвол Экранирование символов Повторить Классы символов Условия ветвления Группировка антоним Обратная ссылка Нулевое широкое утверждение отрицательное нулевое утверждение Комментарии Жадность и лень Обработка вариантов Сбалансированная группа / Рекурсивное соответствие Что еще не было упомянуто? Связаться с автором Ресурсы в Интернете и ссылки, указанные в статье.
Не пугайтесь сложных выражений, представленных ниже, просто следуйте моим шагам, и вы увидите, что регулярные выражения на самом деле не так сложны, как вы думаете. Конечно, если после прочтения этого руководства вы обнаружите, что многое поняли, но почти ничего не запомнили, это тоже нормально — я считаю, что у тех, кто никогда не сталкивался с регулярными выражениями, вероятность запомнить более 80% упомянутого синтаксиса после прочтения этого руководства равна нулю. Здесь главное — понять основные принципы, а в будущем вам нужно будет больше практиковаться и использовать их, чтобы уверенно овладеть регулярными выражениями.
Самое главное — дайте мне. 30 минут Если у вас нет опыта работы с регулярными выражениями, не пытайтесь в 30. секунда Вход в дом — разве что ты Супермен :)
Помимо того, что эта статья является вводным руководством, она также стремится стать справочным пособием по синтаксису регулярных выражений, которое можно использовать в повседневной работе. Что касается личного опыта автора, эта цель достигнута довольно хорошо — видите ли, я сам не смог запомнить все, не так ли?
Очистить форматирование Соглашение о формате текста: профессиональная терминология Мета-символы/синтаксический формат Регулярное выражение Часть регулярного выражения (для анализа) Исходная строка для сопоставления. Описание регулярного выражения или его части. 。
Скрытые крайние заметки Справа от текста есть несколько комментариев, которые в основном предназначены для предоставления некоторой сопутствующей информации или объяснения базовых понятий для читателей без программного фона и их обычно можно игнорировать.
При написании программ или веб-страниц для обработки строк часто возникает необходимость искать строки, соответствующие определённым сложным правилам. Регулярное выражение Это инструмент, используемый для описания этих правил. Другими словами, регулярные выражения — это код, который фиксирует текстовые правила.
Скорее всего, вы использовали команду для поиска файлов в Windows/Dos.
подстановочный знак (
wildcard
)
то есть
*
и
?
Если вы хотите найти все документы Word в определенной папке, вы можете выполнить поиск.
*
.doc
Здесь,
*
может быть истолковано как любая строка. Подобно подстановочным знакам, регулярные выражения также являются инструментом для сопоставления текста, но, в отличие от подстановочных знаков, они могут более точно описать ваши потребности — конечно, ценой является большая сложность — например, вы можете написать регулярное выражение, чтобы найти
Все строки, начинающиеся с 0, за которыми следуют 2-3 цифры, затем дефис "-", и в конце 7 или 8 цифр.
(как
010-12345678
или
0376-7654321
)。
символ Это базовая единица при обработке текста компьютерным программным обеспечением, которая может быть буквой, цифрой, знаком препинания, пробелом, символом новой строки, иероглифом и так далее. строка Это последовательность из 0 или более символов. Текст То есть текст, строка. Говорят о какой-то строке. Совпадение Некоторое регулярное выражение обычно означает, что в этой строке есть часть (или несколько частей), которые удовлетворяют условиям, заданным выражением.
Лучший способ изучения регулярных выражений — начинать с примеров, а затем модифицировать и экспериментировать с ними после того, как вы их поймете. Ниже приведено множество простых примеров с подробными объяснениями.
Предположим, что вы ищете в английском романе. hi Вы можете использовать регулярные выражения. hi 。
Это почти самое простое регулярное выражение, которое может точно сопоставить такие строки: состоит из двух символов, первый символ - h, второй - i Обычно инструменты для работы с регулярными выражениями предлагают опцию игнорирования регистра. Если эта опция выбрана, они могут выполнять совпадение. hi , HI , Hi , hI Любой из этих четырех случаев.
К сожалению, многие слова содержат hi эти два последовательных символа, например him , history , high Подожди. Используй hi Приходите искать, здесь внутри. hi Также будет найдено. Если нужно... точно найти слово hi говоря, мы должны использовать \bhi\b 。
\b
Это специальный код, установленный регулярным выражением (ладно, некоторые люди называют это).
метасимволы,
metacharacter
представляет собой
Начало или конец слова, то есть граница слова.
Хотя обычно английские слова разделяются пробелами, знаками препинания или переносами строк, но
\b
не соответствует ни одному из символов-разделителей этих слов, он
Сопоставить только одно место.
。
Если вы ищете... Не далеко позади hi шла Люси. Ты должен использовать \bhi\b.*\bLucy\b 。
Если нужно более точное выражение, \b Сопоставьте такие позиции: предыдущий и следующий символы не могут быть полностью (один есть, другой отсутствует или не существует). \w 。
Здесь точка является еще одним мета-символом, который соответствует. Любой символ, кроме символа переноса строки. Это тоже метасимвол, но он представляет не символ и не позицию, а количество — он указывает. * Предыдущий контент можно повторять любое количество раз, чтобы добиться соответствия всего выражения. Поэтому. * С连在一起就意味着任意数量的不包含换行的字符。 Сейчас \bhi\b. * \bLucy\b Смысл этого очень очевиден: Привет, затем любые символы (но не перевод строки), и в конце слово Люси. 。
Если одновременно использовать другие метасимволы, мы сможем создать более мощные регулярные выражения. Например, следующий пример:
0\d\d-\d\d\d\d\d\d\d\d Сопоставить такие строки: Начинается с 0, затем идут две цифры, затем дефис "-", и в конце восемь цифр. (то есть китайский номер телефона. Конечно, этот пример подходит только для случая, когда код региона состоит из 3 цифр).
换行符就是'\n',ASCII编码为10(十六进制
0x0A
) символ.
здесь \d Это новый метасимвол, который соответствует. Цифра (0, или 1, или 2, или……) )- не является метасимволом, он просто соответствует самому себе — дефис (или минус, или тире, как бы вы его ни называли).
Чтобы избежать столь многих надоедливых повторений, мы можем записать это выражение так: 0\d{2}-\d{8} Здесь. \d 后面的{的翻译结果是:последующий { 2 }({ 8 }) означает "спереди". \d Необходимо непрерывно повторить совпадение 2 раза (8 раз). 。
Если вы не считаете регулярные выражения трудными для чтения и написания, либо вы гений, либо вы не человек с Земли. Синтаксис регулярных выражений действительно вызывает головную боль, даже для тех, кто использует их часто. Из-за сложности чтения и написания, а также высокой вероятности ошибок, крайне важно найти инструмент для тестирования регулярных выражений.
Другие доступные инструменты для тестирования:
В разных средах некоторые детали регулярных выражений различаются. В данном руководстве рассматривается поведение регулярных выражений в Microsoft .Net Framework 4.0, поэтому я рекомендую вам мой инструмент, разработанный для .Net. Тестер регулярных выражений Пожалуйста, обратитесь к инструкциям на этой странице для установки и запуска этого программного обеспечения.
Вот скриншот работы Regex Tester:
Теперь вы уже знаете несколько полезных метасимволов, таких как \b , . , * и еще \d В регулярных выражениях есть еще больше метасимволов, например, \s Совпадение Произвольные пробелы, включая пробелы, табуляцию (Tab), символы новой строки, китайские полные пробелы и т.д. 。 \w Совпадение буквы, цифры, символы подчеркивания или иероглифы и т.д. 。
Давайте посмотрим на больше примеров:
\ba\w * \b Совпадение по буквам a Начальное слово — это слово, с которого начинается ( \b ), затем буквы a , затем следует произвольное количество букв или цифр ( \w * ), в конце слова ( \b )。
Специальная обработка китайского языка/иероглифов поддерживается движком регулярных выражений .Net, для других сред смотрите соответствующую документацию.
Хорошо, теперь давайте поговорим о том, что означает слово в регулярных выражениях: это один или более последовательных символов \w. Верно, это действительно не имеет большого отношения к тысячам одноименных вещей, которые нужно запоминать при изучении английского :)
\d+ Совпадение 1 или более последовательных цифр Здесь + и * Похожие метасимволы, но отличаются тем, что * Совпадение повторяется любое количество раз (возможно, 0 раз), а + Соответствие Повторить 1 раз или более. 。
\b\w{6}\b Совпадение Слово из шести символов 。
код | 说明 - Объяснение |
---|---|
. | Соответствие любому символу, кроме символа новой строки. |
\w | Совпадение букв, цифр, символов подчеркивания или китайских иероглифов. |
\s | Совпадение с любым пробельным символом |
\d | Сопоставление чисел |
\b | Сопоставление начала или конца слова |
^ | Совпадение с началом строки |
$ | Совпадение конца строки |
метасимвол ^ и $ Все соответствуют одной позиции, это и \b Немного похоже. ^ Совпадение с началом строки, которую вы хотите искать, $ Сопоставление окончания. Эти два кода очень полезны для проверки введённого содержимого, например, если сайт требует, чтобы ваш номер QQ состоял из 5-12 цифр, можно использовать: ^\d{5,12}$ 。
Здесь { 5,12 } и ранее представленной { 2 } похоже на это, просто { 2 }сопоставление Можно повторить ровно два раза. ,{ 5,12 } является Количество повторений не может быть менее 5 и не может превышать 12. иначе ничего не подойдет.
Регулярные выражения обычно предоставляют метод "проверки, соответствует ли заданная строка регулярному выражению", как в JavaScript.
RegExp.test()
Метод Regex.IsMatch() в .NET. Здесь совпадение означает, есть ли в строке часть, соответствующая правилам выражения. Если не использовать ^ и $ слов, для \d{5,12} Таким образом, используя этот метод, можно лишь гарантировать, что строка содержит Непрерывные цифры от 5 до 12. а не вся строка состоит из 5-12 цифр.
потому что использовал ^ и $ Таким образом, вся введенная строка должна быть использована для и. \d{5,12} Совпадайте, то есть весь ввод должен быть от 5 до 12 цифр Таким образом, если введённый номер QQ соответствует этому регулярному выражению, то он удовлетворяет требованиям.
и аналогично опции игнорирования регистра, некоторые инструменты обработки регулярных выражений имеют опцию работы с многострочным текстом. Если эта опция выбрана, ^ и $ значение изменилось на Совпадение в начале и в конце строки. 。
Если вы хотите найти сами метасимволы, такие как ., или *, возникают проблемы: вы не можете указать их, потому что они будут интерпретированы как что-то другое. В этом случае вам нужно использовать \, чтобы отменить специальное значение этих символов. Поэтому вы должны использовать . и \ * Конечно, чтобы найти \само по себе, вам тоже нужно использовать. \ \ .
Например:
unibetter
\
.com
Совпадение
unibetter.com
,
>C:
\
Windows
Совпадение
C:\Windows
。
Ты уже посмотрел на предыдущее. * , + , {2} , {2,5} Эти несколько способов совпадения повторяются. Ниже приведены все квантификаторы в регулярных выражениях (код, задающий количество, например, *, {5,12} и т.д.):
код/синтаксис | 说明 - Объяснение |
---|---|
* | повторить ноль или более раз |
+ | Повторите один раз или несколько раз. |
? | Повторить ноль или один раз. |
{n} | Повторить n раз |
{n,} | повторить n раз или больше |
{m,m} | Повторить n до m раз. |
Вот несколько примеров использования повторов:
Windows\d+ Совпадение Windows за которым следует одно или несколько чисел
^\w+ Совпадение Первое слово строки (или первое слово всей строки, в зависимости от настроек выбора).
Чтобы найти цифры, буквы или пробелы, это очень просто, потому что уже существуют соответствующие символы. * * метасимволы, но если вы хотите сопоставить символы, которые не являются предопределенными метасимволами * * (Например, гласные буквы a, e, i, o, u) что делать?
[Очень просто, вам нужно просто перечислить их в квадратных скобках, как] [aeiou] просто совпадение любой английский гласный буквы , [.?!] Совпадение Знаки препинания (. или ? или !) 。
Мы также можем легко указать один символ. Диапазон как [0-9] Представляемое значение и \d Это совершенно идентично: один数字 аналогично [a-z0-9A-Z_] также полностью эквивалентно \w (Если рассматривать только английский).
Вот более сложное выражение: \ (?0\d{2}[) -]?\d{8} 。
Это выражение может соответствовать. Несколько форматов телефонных номеров как (010)88886666 или 022-22334455 или 02912345678 Давайте проведем некоторый анализ: сначала это управляющий символ. \ (, оно может появляться 0 или 1 раз ( ? ), затем идет один 0 , за которыми следуют 2 цифры ( \d{2} ),затем ) или - или Пробел из которых одно появляется 1 раз или не появляется ? ), в конце 8 цифр ( \d{8} )。
“(” и “)” тоже являются метасимволами, следующее Групповое празднование Поэтому здесь необходимо использовать. экранирование 。
К сожалению, только что выражение тоже может совпадать. 010)12345678 или (022-87654321 такой "неправильный" формат. Чтобы решить эту проблему, нам нужно использовать Условия ветвления В регулярных выражениях Условия ветвления Речь идет о нескольких правилах. Если выполняется хотя бы одно из них, это следует считать совпадением. Конкретный метод заключается в использовании символа | для разделения различных правил. Не понимаете? Ничего страшного, смотрите пример:
0\d{2}-\d{8}|0\d{3}-\d{7} Это выражение может Соответствие двум видам телефонных номеров, разделенных дефисом: один из них - трехзначный код региона и восьмизначный местный номер (например, 010-12345678), другой - четырехзначный код региона и семизначный местный номер (например, 0376-2233445). 。
\ (0\d{2} ) [- ]?\d{8}|0\d{2}[- ]?\d{8} Это выражение Соответствие телефонным номерам с трехзначным кодом, где код может быть в круглых скобках или без них, а между кодом и местным номером может быть дефис, пробел или отсутствовать промежуток. Вы можете попробовать расширить это выражение с помощью условных ветвлений, чтобы оно также поддерживало 4-значные коды地区.
\ d{5}-\d{4}|\d{5} Это выражение используется для сопоставления почтовых индексов США. Правила почтовых индексов в США таковы: это 5 цифр, или 9 цифр, разделенных дефисом. Этот пример приводится для иллюстрации одной проблемы: При использовании ветвящихся условий необходимо обращать внимание на порядок условий. Если ты изменишь это на \ d{5}|\d{5}-\d{4} Таким образом, будет соответствовать только 5-значному почтовому индексу (а также первым 5 цифрам 9-значного индекса). Причина в том, что при проверке условий ветвления тестируется каждое условие слева направо, и если выполняется какое-то из условий, то остальные условия уже не проверяются.
Мы уже упоминали, как повторить один символ (просто добавив к символу квантификатор); но что делать, если нужно повторить несколько символов? Вы можете использовать круглые скобки для указания. подвыражение (также называемый Группировка ), затем вы можете указать количество повторений этого подвыражения, а также выполнить некоторые другие операции с подвыражением (об этом будет рассказано позже).
(\d{1,3}
.
){3}\d{1,3}
Это просто.
IP
Сопоставление адресов
Выражение. Чтобы понять это выражение, проанализируйте его в следующем порядке:
\d{1,3}
Соответствие чисел от 1 до 3 знаков.
,
(\d{1,3}
\
.){3}
Совпадение
Трехзначное число с английской точкой в конце (это в целом тоже это
Группировка
) Повторить 3 раза
в конце добавьте
однозначное или двузначное число
\
d{1,3}
)
。
К сожалению, это также будет соответствовать.
256.300.888.999
Этот невозможный IP-адрес. Если бы можно было использовать арифметические сравнения, возможно, эту задачу можно было бы решить проще, но регулярные выражения не предоставляют никаких функций для работы с математикой, поэтому приходится использовать громоздкие группы, альтернативы и классы символов для описания правильного.
IP
Адрес:
((2[0-4]\d|25[0-5]|[01]?\d\d?)
\
.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
。
В IP-адресе каждое число не может превышать 255, не дайте себя обмануть сценаристами третьего сезона «24»...
Ключ к пониманию этого выражения заключается в понимании 2[0-4]\d|25[0-5]|[01]?\d\d? Я здесь не буду вдаваться в подробности, ты сам должен смочь проанализировать его значение.
иногда необходимо искать символы, которые не принадлежат какому-либо простому определенному классу символов. Например, если нужно найти любые символы, кроме цифр, в этом случае потребуется использовать антоним :
код/синтаксис | 说明 - Объяснение |
---|---|
\W | Совпадение любых символов, кроме букв, цифр, подчеркиваний и иероглифов. |
\S | Совпадение любого символа, который не является пробелом. |
\D | Совпадение любых символов, кроме цифр. |
\B | Совпадение не в начале или конце слова. |
[^x] | Совпадение любого символа, кроме x. |
[^aeiou] | Сопоставление любых символов, кроме букв a, e, i, o, u. |
Пример: \S+ Совпадение строк, не содержащих пробельные символы.
<a[^> ] +> Сопоставьте строки, начинающиеся на "a", заключенные в угловые скобки.
используя круглые скобки для указания подвыражения, Соответствующий текст для этого подвыражения (то есть содержимое этой группы захвата) может быть обработано далее в выражениях или других программах. По умолчанию каждая группа автоматически получает один номер группы Правило таково: слева направо, по левым скобкам в группах, первая появившаяся группа получает номер 1, вторая - номер 2, и так далее.
Обратная ссылка используется для повторного поиска текста, соответствующего ранее найденной группе. Например, \1 представитель Текст, соответствующий группе 1. Трудно понять? Посмотрите на пример:
\b(\w+)\b\s+\1\b можно использовать для поиска повторяющихся слов, как go go или kitty kitty Это выражение сначала является одно слово то есть Более одного буквы или цифры между началом и концом слова. (\b(\w+)\b) это слово будет захвачено в группу с номером 1, затем идет 1 или несколько пробелов ( \s+ ), в конце это Содержимое, захваченное в группе 1 (то есть слово, соответствующее предыдущему совпадению) \1 ) 。
Эм... на самом деле, распределение номеров групп не так просто, как я только что сказал:
- Группа 0 соответствует всему регулярному выражению.
- На самом деле процесс распределения номеров групп следует сканировать дважды слева направо: в первый раз номера присваиваются только неназванным группам, а во второй раз — только названным группам. Поэтому все номера названных групп больше, чем номера неназванных.
- Вы можете использовать синтаксис (?:exp), чтобы лишить группу права на присвоение номера группы.
Вы также можете самостоятельно задать подвыражение. Название группы Чтобы задать имя группы подвыражения, используйте следующую синтаксис: ( ? < Word>\w+ )(或者把尖括号换成'也行:( ?'Word'\w+ ), так что это приводит к \w+ группа называется Word Необходимо сделать обратную ссылку на эту группу. Ловля содержимое, вы можете использовать \k < Word> Так что предыдущий пример можно записать так: \b(? < Word>\w+)\b\s+\k < Word>\b 。
При использовании круглых скобок есть множество специфических грамматических функций. Ниже перечислены некоторые из самых распространенных:
xxxxxxxxxx
分类 代码/语法 说明 - Объяснение
-----------------------------------------------------------------------------------------
(exp) 匹配exp,并捕获文本到自动命名的组里
捕获 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
-----------------------------------------------------------------------------------------
(?=exp) 匹配exp前面的位置
Нулевое широкое утверждение (?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
-----------------------------------------------------------------------------------------
Комментарии (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释
Мы уже обсудили первые два типа грамматики. Третий ( ?:exp ) Это не изменит способ обработки регулярных выражений, просто содержимое такого группового совпадения не будет захвачено в какую-либо группу, как в первых двух случаях, и не будет иметь номера группы. "Почему я хочу это сделать?" — хороший вопрос, как ты думаешь, почему?
Следующие четыре используются для поиска чего-то перед или после определенного содержимого (но не включая его), то есть они действуют как \b , ^ , $ Таким образом, это используется для указания местоположения, которое должно соответствовать определенным условиям (то есть утверждениям), поэтому они также называются Нулевое широкое утверждение Лучше всего объяснить на примерах:
(?=exp)
также называется
Нулевая ширина положительного предсказующего утверждения.
оно
Утверждение, что место появления самого себя может соответствовать выражению exp.
Например
\b\w+(?=ing\b)
, соответствующий для
ing
Передняя часть слова в конце (кроме
ing
внешняя часть)
как найти
I'm
singing while you're
dancing.
оно будет соответствовать
sing
и
danc
。
(?<=exp)
также называется
Нулевая ширина положительного обзора после отправки утверждения
оно
Утверждение о том, что перед местом появления самого себя может соответствовать выражению exp.
Например(
?<=\bre)\w+\b
будет соответствовать с
слова, начинающиеся на re, без re в начале
например, при поиске
reading
a book
это совпадает
ading
。
Земляне, разве вы не считаете, что эти термины слишком сложны и трудны для запоминания? Я тоже так думаю. Главное — знать, что такое существует, а как это называется — не важно! Если человек безымянен, он может сосредоточиться на тренировке меча; если вещь безымянна, ее можно свободно выбирать или отвергать...
Утверждение используется для объявления факта, который должен быть истинным. В регулярных выражениях совпадение продолжается только тогда, когда утверждение истинно.
Если вы хотите вставить запятую каждые три цифры в очень длинном числе (конечно, начиная справа), вы можете искать части, где нужно добавить запятую спереди и внутри: ((?<=\d)\d{3})+\b используйте это для 1234567890 Результат поиска: 234567890 。
В этом примере одновременно используются оба типа утверждений: (?<=\s)\d+(?=\s) Совпадение Цифры, разделенные пробелами (подчеркиваю, не включая эти пробелы) 。
Ранее мы упоминали, как найти. не является определённым символом или не находится в определённом классе символов методов символов (антитезис). Но если мы просто хотим Убедитесь, что определенный символ не появляется, но при этом не хотите его сопоставлять. Что делать в таком случае? Например, если мы хотим найти такие слова — в которых есть буква q, но за ней не следует буква u, мы можем попробовать так:
\b\w * q [ ^u ] \w * \b Совпадение включает После буквы q не стоит буква u. слово Однако, если проводить больше тестов (или если у вас достаточно проницательный ум, и вы сразу это заметили), вы обнаружите, что если q появляется в конце слова, например, Iraq , Benq это выражение вызовет ошибку. Это потому что [^u] Всегда нужно сопоставить один символ, поэтому если q является последним символом слова, то следующие... [ ^u] Будет сопоставлен разделитель слова после "q" (это может быть пробел, точка или что-то другое), после которого следует... \w * \b Будет сопоставлено следующее слово, поэтому \b\w * q [ ^u]\w * \b можно сопоставить целиком Iraq fighting 。 отрицательное нулевое утверждение Это можно решить, потому что оно соответствует только одной позиции и не... потребление Любой символ. Теперь мы можем решить эту проблему следующим образом: \b\w * q(?!u)\w * \b 。
негативный предварительный аутентификатор нулевой ширины
(?!exp)
,
Утверждение, что за этой позицией не может соответствовать выражению exp.
Например:
\d{3}(?!\d)
Сопоставьте три цифры, и это...
Три цифры не могут заканчиваться на цифру.
;
\b((?!abc)\w)+\b
Совпадение
Не содержит последовательных строк.
abc
слово
。
Аналогично, мы можем использовать (?<!exp) , Нулевая ширина отрицательного рецензирования после отправки утверждения. Приходи. Утверждение, что перед этой позицией не может совпадать выражение exp. : (?<![a-z])\d{7} Совпадение Семизначное число, не начинающееся с маленькой буквы. 。
Более сложный пример: (?<=<(\w+)>). * (?=<\/\1>) Соответствие содержимому внутри простых HTML-тегов, не содержащих атрибутов. 。 (?<=<(\w+)>) Назначено таким образом. префикс : Слова, заключенные в угловые скобки (например, это может быть < b>),然后是 .* (произвольная строка), в конце есть один суффикс (?=<\/\1>) Обратите внимание на суффиксы. \/ Он использует упомянутое ранее экранирование символов; \1 это обратная ссылка, которая ссылается на Первая захваченная группа передний (\w+) Совпадающее содержимое, так что если префикс на самом деле является < b>的话,后缀就是 < /b>了。整个表达式匹配的是 < b>和 < /b>之间的内容(再次提醒,不包括前缀和后缀本身)。
Пожалуйста, подробно проанализируйте выражение. (?<=<(\w+)>). * (?=<\/\1>) Это выражение наилучшим образом демонстрирует истинное назначение нулевой ширины утверждения.
Другим использованием круглых скобок является грамматика. (?#comment) Например: 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199) 。
Чтобы включить комментарии, лучше всего активировать опцию «Игнорировать пробелы в режиме игнорирования», чтобы при написании выражений можно было произвольно добавлять пробелы, табуляции и переносы строк, которые будут игнорироваться в процессе использования. После активации этой опции весь текст после # до конца строки будет считаться комментарием и игнорироваться. Например, мы можем записать предыдущее выражение так:
(?<= | # Утверждение о префиксе текста, который необходимо сопоставить |
<(\w+)> | # Найдите буквы или цифры, заключенные в угловые скобки (т.е. HTML/XML теги) |
) | # Завершение префикса |
.* | # Совпадение с любым текстом |
(?= | # Утверждение о суффиксе текста, который необходимо сопоставить |
<\/\1> | # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签 |
) | # Суффикс завершен |
Когда регулярное выражение содержит квантификаторы, допускающие повторы, обычно поведение заключается в том, что оно совпадает (при условии, что вся выражение может быть сопоставлено).
по возможности больше
символов. Например, в этом выражении:
a.
*
b
она будет соответствовать
Самая длинная строка, начинающаяся на 'a' и заканчивающаяся на 'b'.
Если использовать его для поиска
aabab
он будет соответствовать всей строке
aabab
Это называется
жадность
Сопоставление.
Иногда нам нужно больше. ленивый Сопоставление, то есть сопоставление. По возможности меньше. Символы. Все приведенные ранее квантификаторы могут быть преобразованы в ленивый режим соответствия, если добавить к ним вопросительный знак. ? Таким образом. .*? означает Соответствие любому количеству повторений, но с условием использования минимального количества повторений, которое позволяет сделать все соответствие успешным. Теперь давайте посмотрим на пример ленивой версии:
a.
*
?b
Совпадение
Самая короткая строка, начинающаяся с a и заканчивающаяся на b.
Если применить это к
aabab
это будет соответствовать
aab
(первые три символа)
и
аб
。
код/синтаксис | 说明 - Объяснение |
---|---|
*? | Повторяйте любое количество раз, но старайтесь минимизировать повторения. |
+? | Повторите один раз или несколько раз, но постарайтесь минимизировать повторения. |
?? | Повторять 0 или 1 раз, но как можно меньше повторений. |
{n,m}? | Повторите от n до m раз, но с минимальным количеством повторений. |
{n,}? | Повторите n раз, но по возможности с минимальным повторением. |
Почему первое совпадение — это aab (с первого по третий символ), а не ab (со второго по третий символ)? Проще говоря, потому что у регулярных выражений есть другое правило, которое имеет более высокий приоритет, чем правило жадности/ленивости: совпадение, которое начинается раньше, имеет наивысший приоритет — совпадение, которое начинается первым, выигрывает.
В приведенном выше тексте упоминаются несколько параметров, таких как игнорирование регистра, обработка многострочных данных и т.д. Эти параметры могут использоваться для изменения способа обработки регулярных выражений. Ниже приведены часто используемые параметры регулярных выражений в .Net:
Название | 说明 - Объяснение |
---|---|
IgnoreCase
(Игнорировать регистр)
|
Сравнение не учитывает регистр. |
Multiline
(Многострочный режим)
|
изменить ^ и $ значение, чтобы они соответствовали в начале и в конце каждой строки, а не только в начале и в конце всей строки. (В этом режиме, $ Точное значение: соответствие \n позиции перед и позиции перед концом строки.) |
Singleline
(Однострочный режим)
|
Измените значение . так, чтобы оно соответствовало каждому символу (включая символы новой строки \n). |
IgnorePatternWhitespace
(Игнорировать пробелы)
|
Игнорируйте неэкранированные пробелы в выражении и включите. # Помеченные комментарии |
ExplicitCapture
(Явное захватывание)
|
Только захватывать явно именованные группы. |
Часто задаваемый вопрос: можно ли использовать только один из двух режимов — многострочный или однострочный? Ответ: нет. Эти два параметра не имеют никакой взаимосвязи, кроме того, что их названия довольно похожи (что может вводить в заблуждение).
В C# вы можете использовать Конструктор Regex(String, RegexOptions) 来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
Иногда нам нужно соответствовать, как ( 100 * ( 50 + 15 ) ) Такую вложенную иерархическую структуру можно просто использовать. \ (.+ \ ) то будет соответствовать только содержимому между самым левым открывающим скобкой и самым правым закрывающим скобкой (здесь мы обсуждаем жадный режим, в ленивом режиме также есть проблемы, описанные ниже). Если в исходной строке количество открывающих и закрывающих скобок не совпадает, например, ( 5 / ( 3 + 2 ) ) ) Можно ли в такой строке найти содержимое между самыми длинными парными скобками, если количество открывающих и закрывающих скобок не совпадает?
Представленная здесь грамматика сбалансированных групп поддерживается .Net Framework; другие языки/библиотеки не обязательно поддерживают эту функцию или поддерживают её, но требуют использования другой синтаксиса.
Чтобы избежать ( и \ ( Давай полностью запутаем твой мозг, мы всё-таки используем угловые скобки вместо круглых. Теперь наш вопрос заключается в том, как... xx aa> yy Как извлечь содержимое между самыми длинными парными угловыми скобками в такой строке?
Здесь необходимо использовать следующие грамматические конструкции:
(?'group') Назовите захваченный контент "group" и добавьте его. Стек
(?'-group') Из стека извлекается последнее содержимое захвата с именем group, если стек изначально пуст, то совпадение для этой группы считается неудачным.
(?(group)yes|no) Если на стеке существует захваченный контент с именем group, продолжайте сопоставление выражения части yes, иначе продолжайте сопоставление части no.
(?!) Нулевая ширина отрицательного предварительного утверждения, поскольку нет постфиксного выражения, попытка сопоставления всегда терпит неудачу.
我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。
如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。
xxxxxxxxxx
< #самая внешняя левая скобка
[^<>]* #Содержимое, не являющееся скобками, после самого внешнего левого скобки
(
(
(?'Open'<) #Встретил левую скобку, напиши на доске "Open"
[^<>]* #Содержимое после левой скобки, которое не является скобкой
)+
(
(?'-Open'>) #Наткнулся на закрывающую скобку, стер одно "Open"
[^<>]* #Содержимое, которое следует за закрывающей скобкой и не является скобкой
)+
)*
(?(Open)(?!)) #Перед встречей с внешней правой скобкой проверьте, остались ли на доске не стертые "Open"; если остались, то сопоставление не удалось.
> #самая внешняя правая скобка
Одним из самых распространенных применений сбалансированных групп является сопоставление HTML. Приведенный ниже пример может сопоставлять вложенные элементы. < div>标签: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>
Вверху уже описано множество элементов для построения регулярных выражений, но есть еще много неупомянутых вещей. Ниже приведен список некоторых неупомянутых элементов, включая синтаксис и простое объяснение. Вы можете найти более подробные справочные материалы в Интернете, чтобы изучить их, когда они вам понадобятся. Если вы установили библиотеку MSDN, вы также можете найти в ней подробную документацию по регулярным выражениям в .NET.
код/синтаксис | 说明 - Объяснение |
---|---|
\a | Сигнальный символ (при его печати компьютер издает звук) |
\b | Обычно это место разделения слов, но если использовать в классе символов, это будет означать возврат на один символ назад. |
\t | Табуляция, Tab |
\r | ввод |
\v | Вертикальная табуляция |
\f | Разделитель страниц |
\n | Перенос строки |
\e | Escape |
\0nn | Символ с восьмеричным кодом nn в ASCII-коде. |
\xnn | Символ с шестнадцатеричным кодом nn в кодировке ASCII. |
\unnnn | Символ с шестнадцатеричным кодом nnnn в кодировке Unicode. |
\cN | ASCII управляющие символы. Например, \cC означает Ctrl+C. |
\A | Начало строки (похоже на ^, но не подвержено влиянию обработки многострочных опций) |
\Z | Конец строки или конец строки (не подлежит обработке в многопоточном варианте) |
\z | Конец строки (подобно $, но не подвержен влиянию опции обработки нескольких строк) |
\G | Начало текущего поиска |
\p{name} | В Unicode существует класс символов, названный name, например \p{IsGreek}. |
(?>exp) | Жадный подвыражение |
(? < x> - < y>exp) | Сбалансированная группа |
(?im-nsx:exp) | Изменение параметров обработки в подвыражении exp. |
(?im-nsx) | Измените параметры обработки для части, следующей за выражением. |
(?(exp)yes|no) | Рассматривайте exp как нулевую ширину положительного предварительного утверждения. Если в этой позиции можно выполнить сопоставление, используйте yes в качестве выражения для этой группы; в противном случае используйте no. |
(?(exp)yes) | То же самое, просто используйте пустое выражение в качестве "нет". |
(?(name)yes|no) | Если группа с именем name захватила содержимое, используйте yes в качестве выражения; в противном случае используйте no. |
(?(name)yes) | То же самое, просто используйте пустое выражение в качестве "нет". |
好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?
Если у вас есть жалобы на меня, или вы считаете, что я мог бы быть более искусным в манипуляциях, или у вас есть любые другие вопросы, пожалуйста, обращайтесь. Мой блог Дайте мне знать.
Вы недавно использовали: