Шаблон регулярного выражения для:
="any characters that aren't a double quote"
Is ="[^"]*"
, который в качестве строкового литерала Java равен "=\"[^\"]*\""
.
Конструкция [...]
называется класс персонажей ;Например, [aeiou]
соответствует одному из строчных гласных.Конструкция [^...]
является классом символов с отрицанием ;например, [^aeiou]
соответствует одному из всего, кроме строчных гласных (который включает согласные, символы, цифры и т. д.).
Обратите внимание, что этот шаблон не позволяет экранировать "
в String
(см. ссылку нижедля шаблонов, которые учитывают эту возможность).
Ссылки
Смежные вопросы
О сопоставлении жадных, неохотных и отрицательных классов символов
Чтобы понять, почему ".+"
не «работает», как ожидалось, и почему иногда вы видите ".+?"
неохотную версию, чтобы попытаться «исправить» эту проблему, рассмотрите следующий пример:
Пример 1: От A до Z
Давайте сравним эти две модели: A.*Z
и A.*?Z
.
С учетом следующего ввода:
eeeAiiZuuuuAoooZeeee
Шаблоны дают следующие совпадения:
Давайте сначала сосредоточимся на том, чтоA.*Z
делает.Когда он соответствует первому A
, .*
, будучи жадным, сначала пытается найти как можно больше .
.
eeeAiiZuuuuAoooZeeee
\_______________/
A.* matched, Z can't match
Поскольку Z
не совпадает, двигательВозвраты, и .*
должны соответствовать одному меньшему .
:
eeeAiiZuuuuAoooZeeee
\______________/
A.* matched, Z still can't match
Это происходит еще несколько раз, пока, наконец, мы не придем к этому:
eeeAiiZuuuuAoooZeeee
\__________/
A.* matched, Z can now match
Сейчас Z
может совпадать, поэтому общий шаблон совпадает:
eeeAiiZuuuuAoooZeeee
\___________/
A.*Z matched
В отличие от этого, повторение с неохотой в A.*?Z
сначала соответствует как можно меньшему количеству .
, а затем, при необходимости, принимает больше .
.Это объясняет, почему он находит два совпадения во входных данных.
Вот визуальное представление о том, что два шаблона совпали:
eeeAiiZuuuuAoooZeeee
\__/r \___/r r = reluctant
\____g____/ g = greedy
Пример: альтернатива
Во многих приложениях два совпадения в вышеприведенном вводе - это то, что нужно, поэтому вместо жадного .*
используется нежелательный .*?
для предотвращения чрезмерного совпадения.Однако для этого конкретного шаблона есть лучшая альтернатива, использующая класс отрицанных символов.
Шаблон A[^Z]*Z
также находит те же два совпадения, что и шаблон A.*?Z
для вышеуказанного ввода ( каквидел на ideone.com ).[^Z]
- это то, что называется классом отрицательных символов : он соответствует чему угодно, кроме Z
.
Основное различие между двумя шаблонами заключается в производительности: более строгий, отрицательный символкласс может соответствовать только одному способу для данного ввода.Не имеет значения, используете ли вы жадный или неохотный модификатор для этого шаблона.На самом деле, в некоторых вариантах вы можете сделать еще лучше и использовать так называемый притяжательный квантификатор, который вообще не отслеживается.
Ссылки
Пример 2: от A до ZZ
Этот пример должен быть иллюстративным: он показывает, как шаблоны классов жадных, неохотных и отрицательных символов по-разному совпадают при одном и том же вводе.
eeAiiZooAuuZZeeeZZfff
Это совпадения для вышеуказанного ввода:
Вот наглядное представление того, что они совпали:
___n
/ \ n = negated character class
eeAiiZooAuuZZeeeZZfff r = reluctant
\_________/r / g = greedy
\____________/g
Смежные вопросы