Добавлены детали
Я нашел в Интернете следующие два способа отрицания:
?!
[^\w]
Но я не могу найти документацию на испанском и английском языках, которую они используют для описания операции, я считаю ее слишком сложной, чтобы понять значение обоих и как их правильно использовать для получения ожидаемого результата. Текущий ответ устраняет проблему, но не дает определения использования.
Постановка задачи
Я хочу выбрать все те слова, которые не находятся в кавычках в тексте. Я знаю, как сделать наоборот.
Пример:
Lorem ipsum «боль сит амет» , consectetur adipiscing elit, maecenas est felis «сидеть амет» .
Со следующим регулярным выражением вы можете взять слова в круглых скобках:
/"([\w\s]+)"/gim
Результат
[
1 => 'dolor sit amet',
2 => 'sit amet'
]
Что я ищу
[
1 => 'Lorem ipsum ',
2 => ', consectetur adipiscing elit, maecenas est felis ',
3 => '.',
]
Другим примером может быть, из следующего списка:
- Привет
- привет
- привет
- Здравствуй*
- привет
Распечатайте/выберите те, в которых не используются буквенно-цифровые символы (я знаю, как взять противоположное установленному обозначению). Возьмем все, что не является буквенно-цифровым символом, возьмем все те слова, в которых нет буквы «л», возьмем все, что не начинается с буквы «з» и т. д.
Рабочий пример: http://www.regextester.com/15
Я бы ожидал сделать что-то подобное для всего, что не начинается с «а»:
/!^a.*/
Но, очевидно, это не работает для меня, я жду ваших отзывов.
Уточнение
Я также хотел бы понять предлагаемое решение, а не просто копипаст для решения проблемы.
Примечание . Регулярное выражение, которое я цитирую здесь для получения текста, работает для меня в PHP и JavaScript (языки, которые я использую для решения проблемы), я видел, что существуют небольшие вариации регулярных выражений на разных языках. но между этими двумя нет ничего существенного. Поэтому я хотел бы, чтобы предлагаемое решение работало в одном из 2.
Я добавляю этот ответ как информацию, связанную с регулярными выражениями. Это мой первый ответ на SO на испанском языке, и это не перевод, поэтому, если он неверен, я могу удалить его или исправить.
Что касается того, что вы прокомментировали в своем вопросе:
Это два разных понятия. С одной стороны, у вас есть то, что считается классом,
lookaround
а с другой стороны, класс персонажа. Они работают следующим образом:Осмотр
Осмотры можно понимать как различные способы увидеть, предшествует ли шаблон (или нет) другой шаблон. Например, выражение
hola(?!chau)
будет соответствовать словуhola
, если следующее слово не существуетchau
.А именно:
Ваш вопрос связан с тем, "как отрицать", но я также хотел упомянуть, что обходные пути делятся на:
hola(?=chau)
и будет соответствовать слову привет , только если есть покаhola(?!chau)
и будет соответствовать слову привет , только если тогда НЕТ до свидания(?<=chau)hola
и будет соответствовать слову привет , только если перед приветствием существует до свидания(?<!chau)hola
и будет соответствовать слову привет , только если перед приветствием НЕТ до свиданияВажно отметить, что просмотр назад не поддерживается Javascript во всех браузерах ( см. совместимость ).
Дополнительную информацию об обходах можно найти по адресу:
http://www.regular-expressions.info/lookaround.html .
Классы персонажей
С другой стороны, есть классы символов , которые в испанском языке понимаются как набор символов (или класс символов ) и используются с использованием квадратных скобок
[
...]
Другими словами, если у нас есть
[aeiou]
, будут сопоставляться только гласные без знаков ударения.Точно так же класс может быть инвертирован, как вы упомянули
^
в начале, используя ... поэтому[^aeiou]
в этом случае он будет соответствовать символу, который не является гласной без тильды.Вот дополнительная информация о классах символов:
http://www.regular-expressions.info/charclass.html
глаголы
Теперь, после предоставления вам немного контекста. Если вы хотите использовать регулярные выражения для перехвата/сопоставления всех слов, не заключенных в кавычки, то в PCRE (Perl-совместимые регулярные выражения, поддерживаемые PHP, R, Delphi и другими) есть глаголы , которые очень полезны в вашем случае.
Наиболее известны
(*SKIP)
и(*FAIL)
часто используются вместе и обычно используются таким образом:Практический пример
Эти типы шаблонов часто называют методом сброса , и они всегда используют одну и ту же форму шаблонов, разделенных
OR
:Таким образом, приведенное выше выражение
".*?"(*SKIP)(*FAIL)|(\w+)
отбрасывает все совпадения с тем, что было до skip и fail(".*?"
), и фиксирует последний шаблон (который использует круглые скобки... круглые скобки используются для захвата содержимого).Объяснение регулярного выражения
".*?"(*SKIP)(*FAIL)|(\w+)
будет таким:Поэтому в ссылке выше, когда это выражение применяется к тексту:
Захвачено следующее содержимое:
Вывод: регулярные выражения, на мой взгляд, эффектны, но только если вы знаете, как их использовать. Лично я без них не могу, но как и все... чтобы забить гвоздь нужен молоток, а не отвертка. В случае регулярных выражений они отлично подходят для сопоставления с образцом, но если вам нужна логика, то это определенно не тот инструмент, который следует использовать.
В таких случаях лучше всего пойти по простому пути (регулярное выражение — это ад). Так что, если у вас уже есть, как найти то, что вы не хотите, с помощью
Поэтому проще всего использовать
preg_split
для удаления всего, что соответствует этому выражению .При выполнении этого в цепочке, которая у вас есть в качестве примера, он вернет три блока, которые являются блоками, которые не содержатся в кавычках.
Если вы хотите получить то, что будет удалено, сначала сделайте это,
preg_match()
а затем вы можете сделать обычное разделение строкиexplode
без необходимостиpreg_split
.Конечно можно использовать
preg_split
но это будут ненужные циклы обработки.В другом случае немного проще
что-нибудь с не буквенно-цифровыми символами
Просто используйте отрицательный диапазон, подобный этому выражению, которое отмечает все небуквенно-цифровые символы.
Уже с этим выражением вы можете получить входные данные, которые делают математику, используя
preg_grep
выход
все, что не начинается с
С этим выражением:
^[^a]+
выход
Если вы используете следующее регулярное выражение:
Или, точнее, что-то похожее на следующий код:
Вы получите следующий вывод:
Посмотреть демо онлайн.
Если вы посмотрите документацию по функции
preg_split
, то обнаружите, что флагPREG_SPLIT_NO_EMPTY
удаляет пустые строки из вывода, а флагPREG_SPLIT_DELIM_CAPTURE
возвращает в результат часть регулярного выражения, заключенную в круглые скобки.Техника сброса (также называемая RexEgg « лучшим трюком
с регулярными выражениями») — работает в JavaScript.
Он очень прост, состоит из
Это все!
Этот «трюк» основан на том, что он будет соответствовать тому, что не хочет соответствовать, но вот в чем фокус: это не будет захвачено! Это тонкое различие позволит нам узнать, соответствует ли оно нашему исключению или соответствует ли оно тому, что мы хотели, чтобы оно соответствовало.
Скобки в
(esto sí)
создают группу и, как и всякая группа, при совпадении с текстом захватывают его... То есть получаются отдельно в результатеRegExp.exec()
или в результатеString.matchAll()
. Так что это просто вопрос проверки, было ли что-то захвачено в группе 1 или нет.Возьмем пример из вопроса: выделите весь текст, кроме частей в кавычках.
Код: