Как отрицать (не выбирать) с регулярными выражениями? в PHP или языке сценариев JavaScript

Детали добавленные

Я нашел в Интернете следующие два способа отрицать:

  • ?!
  • [^\w]

Но мне не удается найти документацию на испанском языке и англичанин, который они используют, чтобы описывать функционирование, считал это слишком много продвинутым, чтобы понимать значение обоих и как использование их apropiadamente, чтобы получать ожидаемый результат. Настоящий ответ решает проблему, но не дает определение использования.


Планирование проблемы

Я хочу выбрать все те слова, которые не между кавычками внутри текста. Я знаю, как делать противоположность.

Пример:

Lorem ipsum "боль sit amet", consectetur adipiscing elit, maecenas est felis "sit amet".

Со следующим регулярным выражением он мог бы брать слова, которые находятся между скобкой:

/"([\w\s]+)"/gim

Результат

[
    1 => 'dolor sit amet',
    2 => 'sit amet'
]

То, что я ищу

[
    1 => 'Lorem ipsum ',
    2 => ', consectetur adipiscing elit, maecenas est felis ',
    3 => '.',
]

Другой пример был бы, следующего списка:

  • Здравствуйте!
  • Hol@
  • hol.
  • hol*
  • holo

Печатать / выбирать те, которые не используют буквенно-цифровые символы (я знаю, как брать их противоположно установленному указанию). Брать все то, что не буквенно-цифровой характер, брать все те слова, которых не есть у «l», направлять все то, что не инициализируется с буквой «z», и т.д.

Функциональный пример: http://www.regextester.com/15

Я надеялся бы сделать что-то как это для всего того, что я не инициализировал с «в»:

/!^a.*/

Но очевидно оно я не функционирует, я остаюсь в ожидание Вашего feedback.

Разъяснение

Мне хотелось бы понимать также решение, которое они выдвигают, и не только будьте copy - паситесь, чтобы решать проблему.

Заметь: Регулярное выражение, которое здесь я упоминаю, чтобы получать текст, я функционирует в PHP и языке сценариев JavaScript (языки, которые я использую, чтобы решать проблему), я увидел, что есть маленькие изменения регулярных выражений в различных языках, но между этими 2 не что-то существенное. Следовательно мне хотелось бы, что предложенное решение функционировало в одном 2.

Шрифты опоры

27
задан 23.05.2017, 15:39
3 ответа

Я добавляю этот ответ как информация, связанная с регулярными выражениями. Я первый ответ в SO на Испанском языке и не перевод, а следовательно, если она не правильна, я могу удалять ее или исправлять ее.

Относительно которого ты прокомментировал в твоем вопросе:

?!     -> conocido como Negated lookahead en inglés
[^\w]  -> conocido como Character class en inglés (en este caso negada)

Это это две различные концепции. С одной стороны tenés то, чего считается одним lookaround и с другой стороны character class. Они функционируют таким образом:


Lookarounds

lookaround, было бы возможно понимать как различные способы видеть, - ли главный файл (или он не) предшествуемый или последованный другим главным файлом. Например, выражение hola(?!chau) будешь делать matching слова hola всякий раз когда не существовало слово chau далее.

Regular expression visualization

А именно:

hola, ¿qué tal?   <-- OK
hola SO           <-- OK
holachau          <-- Falla

Твой вопрос связан "как отрицать", но также он хотел упомянуть тебе о том, что lookarounds разделяются в:

  • Lookahead (видеть вперед):
    • Positive: он определяется как hola(?=chau) и идет в matchear слово привет только, если он далее существует chau
    • Negative: он определяется как hola(?!chau) и идет в matchear слово привет только, если он далее не существует chau
  • Lookbehind (видеть назад):
    • Positive: он определяется как (?<=chau)hola и идет в matchear слово привет только, если в existe chau нежели привет
    • Negative: он определяется как (?<!chau)hola и идет в matchear слово привет только, если он не существует chau нежели привет

Важно упоминать, что lookbehind не вынесены Javascript.

Обрежь находить больше информации о lookarounds в:

http://www.regular-expressions.info/lookaround.html


Character classes

С другой стороны, существуют character class, что на испанском языке способ это понимать был бы набором символов (или класс символов) и он используется используя квадратные скобки [..].

А именно, что, если мы имеем [aeiou], только он будет сделан matching с гласными без тильд.

Regular expression visualization

Так же, класс может отказываться, как ты упомянул используя ^ сначала..., из-за которого [^aeiou] в этом случае он не будет делать matching с гласными.

Regular expression visualization

Здесь есть больше информации character classes:

http://www.regular-expressions.info/charclass.html


Глаголы

Сейчас, после давая тебе немного контекста. Если querés, использовать регулярные выражения, чтобы брать / совпадать все слова, которые не между кавычками, у тогда PCRE (Регулярные Совместимые Выражения с Perl, вынесенными PHP) есть глаголы, которые очень полезные в твоем случае.

Самые известные (*SKIP) и (*FAIL) который обычно используют целиком и обычно используют, таким образом:

".*?"(*SKIP)(*FAIL)|(\w+)

Практический пример

Этот тип главных файлов обычно называется техника сноски (discard technique), и всегда они используют ту же форму главных файлов, отделенный из-за OR:

patrón de descarte 1|patrón de descarte 2|patrón de descarte N|(GUARDAR ESTO)

Regular expression visualization

Поэтому, выражение наверху ".*?"(*SKIP)(*FAIL)|(\w+) будешь отвергать все главные файлы, что они содержат skip/fail, и идет захватывать последний главный файл (который использует скобку..., скобки используются, чтобы захватывать контент).

Регулярное выражение ".*?"(*SKIP)(*FAIL)|(\w+) объясненная он был бы:

".*?"     Lo uso para buscar lo que SI quiero descartar, y para indicarle
          al engine que descarte agrego (*SKIP)(*FAIL)
|(\w+)    o (si el patron no se descarta) busco las palabras y las capturo

Поэтому, в соединении наверху, когда применяется это выражение к тексту:

Lorem ipsum "боль sit amet", consectetur adipiscing elit, maecenas est felis "sit amet".

Захватывается следующий контент:

MATCH 1
1.  [0-5]   `Lorem`
MATCH 2
1.  [6-11]  `ipsum`
MATCH 3
1.  [30-41] `consectetur`
MATCH 4
1.  [42-52] `adipiscing`
MATCH 5
1.  [53-57] `elit`
MATCH 6
1.  [59-67] `maecenas`
MATCH 7
1.  [68-71] `est`
MATCH 8
1.  [72-77] `felis`

Заключение, регулярные выражения по моему мнению эффектные, но только, если они умеют быть использованными. В моем личном случае, я не могу жить без них, но как все..., чтобы фиксировать гвоздь, нуждается в молоте и не отвертке. В случае regex, они превосходные для pattern matching, но если ты нуждаешься в логике тогда, окончательно это не указанный инструмент.

21
ответ дан 01.12.2019, 08:16
  • 1
    Я остался at и # 243; nito с твоим ответом, хорошим explicaci и # 243; n, documentaci и # 243; n. Я поздравляю тебя и благодарен за твой превосходный ответ, ты приобрел обет лучшего ответа. Я тебе благодарен за informaci и # 243; n, и #191; есть alg и # 250; n книга, которую ты рекомендовал бы мне, на котором ты объяснил? (не важно, чтобы он был в ingl и # 233; s). Конечно: Матч == Совпадать / Совпадение. Проверь ее и #250; ltima modificaci и # 243; n твоего ответа для большего info: es.stackoverflow.com/posts/11509/revisions . Превосходная работа. – Chofoteddy 01.06.2016, 04:50
  • 2
    @Chofoteddy, удовольствие помогать. У меня нет акцента jaja, спасибо за исправление этого. Относительно документации, я изучил многий из regular-expressions.info/quickstart.html . Уже у меня есть мой первый положительный обет!:) – Federico Piazza 01.06.2016, 05:18

Лучшее в этих случаях состоит в том, чтобы брать легкую дорожку (Regexp - ад). Тогда, если уже ты имеешь, как нахождение того, что ты не хочешь найти с

/"([\w\s]+)"/gim

Тогда самое легкое состоит в том, чтобы использовать preg_split чтобы удалять все то, что совпадало бы с этим выражением

preg_split("/\"([\w\s]+)\"/", $input_line);

Выполнив это в цепи, которая у тебя есть примера, он возвратит тебе три блока, которые являются блоками, которые не содержались в кавычках

[
    1 => 'Lorem ipsum ',
    2 => ', consectetur adipiscing elit, maecenas est felis ',
    3 => '.',
]

Если ты хочешь получить то, что удалит снопы сначала preg_match() и потом ты можешь делать нормальный split цепи используя explode без необходимости preg_split.

Конечно ты можешь использовать preg_split но они были бы ненужными циклами обработки.

Для другого случая он немного более легкий

все то, у что были бы не буквенно-цифровые символы

Здравствуйте!
Hol@
hol.
hol*
holo
Печатать / выбирать те, которые не используют буквенно-цифровые символы

Достаточно использовать ранг, отрицаемый как это выражение, которое помечает все не буквенно-цифровые символы

[^a-zA-z0-9]+

Уже с этим выражением ты можешь получать поступающие данные, которые делают mathc используя preg_grep

preg_grep("/[^a-zA-z0-9]+/", explode("\n", $input_lines));

output

array(3
1   =>  Hol@
2   =>  hol.
3   =>  hol*
)

все то, что он не начинал бы из-за в

  • рис
  • поцелуй
  • академия
  • фотография
  • игра
  • искусство

С этим выражением: ^[^a]+

preg_grep("/^[^a]+/", explode("\n", $input_lines));

output

array(3
1   =>  beso
3   =>  foto
4   =>  juego
)
8
ответ дан 01.12.2019, 08:16
  • 1
    Я понимаю, что несмотря на то, что это удаляю и # 237; в, но в случае, что dese и # 233; располагать этими текстами, которые остались, как он делает это funci и # 243; n preg_match () в PHP, и #191; c и # 243; mo оставаться и # 237; в?. Используя функции remplazo он у меня остается плоский текст, где я не могу знать, в котором ты уезжаешь, удалил текст, и т.д. – Chofoteddy 09.12.2015, 01:02
  • 2
    чтобы получать то, что исчезать, и # 225; ты делаешь сначала preg_match() и потом можешь делать нормальный split цепи используя explode без необходимости preg_split - > добавленный под ответ – JuanK 09.12.2015, 01:11
  • 3
    В javascript tambi и # 233; n podr и # 237; чтобы использовать split. – eloyesp 09.12.2015, 02:17
  • 4
    @JuanK, если, оно функционирует для цепей этого типа, но не подает меня как negaci и # 243; n одной b и # 250; squeda, а именно: " найди все слова, которые не имеют одной по отношению к " – Chofoteddy 11.12.2015, 19:36
  • 5
    Ты можешь использовать tambiien preg_replace и заменять совпадения из-за " ". – Lorthas 06.01.2017, 22:15

Если ты используешь следующее регулярное выражение:

"([\w ]*)"

regex

Или более точно что-то сходное со следующим кодом:

<?php
  $str = "Lorem ipsum \"dolor sit amet\", consectetur adipiscing elit, maecenas est felis \"sit amet\".";
  $array = preg_split("/\"([\\w ]*)\"/", $str, -1,
          PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
  print_r($array);
?>

Ты получаешь следующий вывод:

Array
(
    [0] => Lorem ipsum 
    [1] => dolor sit amet
    [2] => , consectetur adipiscing elit, maecenas est felis 
    [3] => sit amet
    [4] => .
)

Видеть demo интерактивно.

Если ты бросаешь беглый взгляд в документации функции preg_split, ты найдешь, что флаг PREG_SPLIT_NO_EMPTY удали из вывода пустые цепи и флаг PREG_SPLIT_DELIM_CAPTURE возврати часть регулярного выражения между скобкой в результате.

4
ответ дан 01.12.2019, 08:16

Теги

Похожие вопросы