RegEx Java - Как исключить определенное слово между скобками [duplicate]

В Python 3.5 вы также можете использовать этот синтаксис в list, dict, tuple и set отображениях (также иногда называемых литералами). См. PEP 488: Дополнительные распакованные обобщения .

>>> (0, *range(1, 4), 5, *range(6, 8))
(0, 1, 2, 3, 5, 6, 7)
>>> [0, *range(1, 4), 5, *range(6, 8)]
[0, 1, 2, 3, 5, 6, 7]
>>> {0, *range(1, 4), 5, *range(6, 8)}
{0, 1, 2, 3, 5, 6, 7}
>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> e = {'six': 6, 'seven': 7}
>>> {'zero': 0, **d, 'five': 5, **e}
{'five': 5, 'seven': 7, 'two': 2, 'one': 1, 'three': 3, 'six': 6, 'zero': 0}

Он также позволяет распаковывать несколько итераций в одном вызове функции.

>>> range(*[1, 10], *[2])
range(1, 10, 2)

( Благодаря mgilson для ссылки PEP.)

187
задан romiem 16 January 2010 в 22:12
поделиться

3 ответа

Вот еще один способ: (используя негативный прогноз вперед ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Примечание: существует только одно фиксирующее выражение: ([a-z0-9]+).

247
ответ дан Seth 27 August 2018 в 20:01
поделиться
  • 1
    Блестящий, похоже, сделал трюк. Мне действительно нужно это правило для перезаписи URL-адресов, и я хотел проигнорировать «образы», ​​«css». и "js" папка. Итак, мое правило выглядит следующим образом: ^ / (?! css | js | images) ([az] +) /? (\? (. +))? $ И переписывает файл /Profile.aspx?id=$1& $ 3 Будет ли это правило работать правильно и распространять строку запроса? Поэтому, если кто-то посещает mydomain.com/hello?abc=123 , я бы хотел, чтобы он переписал mydomain.com/Profile.aspx?id=hello&abc=123 Я также немного не уверен в производительности (. +) В конце, чтобы захватить запрос в исходном запросе. – romiem 16 January 2010 в 22:32
  • 2
    Похоже, это еще один вопрос. Регулярное выражение, которое у вас есть, будет захватывать строку запроса - test и проверяет, идет ли ваша строка запроса. Также - (\?(.+))?$ должен быть быстрым. Я бы не стал слишком беспокоиться о скорости. – Seth 17 January 2010 в 21:25
  • 3
    Это не сработало для меня, в то время как решение Alix Axel действительно работало. Я использую класс java.util.regex.Pattern Java. – Mark Jeronimus 20 June 2013 в 19:27
  • 4
    Я подтверждаю reMark от Марка;) - например, Pycharm основан на Java, не так ли? Итак, рассматривая регулярные выражения в Pycharm-поиске, решение Alix работает, другое - нет. – fanny 16 September 2016 в 14:13

Это должно сделать это:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

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

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);
29
ответ дан Alix Axel 27 August 2018 в 20:01
поделиться
  • 1
    Я думал, что смотреть сзади требует шаблона с фиксированной шириной? – simon 16 September 2013 в 10:14
  • 2
    @simon: Это так? – Alix Axel 16 September 2013 в 21:58
  • 3
    @AlixAxel Это так, но более разумные регулярные выражения позволят чередовать переменные длины для альтернатив (и использовать самый длинный), если каждая альтернатива имеет фиксированную длину. – ChrisF 22 December 2014 в 04:33
  • 4
    это умно, но мне не удается, если проигнорированное слово находится на конце любого другого слова. т. е. если вы добавите «a» как один из игнорируемых слов, тогда любое слово, которое заканчивается на a, игнорируется – singmotor 10 April 2017 в 15:19

Как вы хотите исключить оба слова, вам понадобится объединение:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

Теперь оба условия должны быть истинными (ни ignoreme , ни ignoreme2 разрешено), чтобы иметь соответствие.

11
ответ дан Gumbo 27 August 2018 в 20:01
поделиться
  • 1
    Это эквивалентно более короткому выше, что является негативным взглядом на набор альтернатив. – ChrisF 22 December 2014 в 04:32
  • 2
    @ChrisF Нет, не совсем. Решение Seth не будет совпадать с чем-то вроде /ignoremenot, а за / следует ignoreme. – Gumbo 22 December 2014 в 08:16
Другие вопросы по тегам:

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