Вопрос по regex, javascript, pcre – Есть ли в PCRE такая вещь, как «отрицательное чередование» или «отрицательные строковые классы», как «отрицательные символьные классы»?

0

Хорошо, так что в то время как шаблон[abc] соответствует одному символу, которыйa, b, или жеc, шаблон[^abc] соответствует любому данному персонажуisn't a, b, или жеc.

Теперь, если я заменюstring заcharacter в приведенном выше заявлении, это все равно будет применяться, если я также изменил первый шаблон на альтернативную конструкцию, как(abc|def|ghi), - это будет соответствовать последовательной строке из трех символов, равнойabc, def, или жеghi, Что я могу сделать, чтобы соответствовать любой строке из трех символов, которыеisn't равноabc, def, или жеghi?

Вы отметили это как "javascript" и "pcre". Обратите внимание, что они делаютnot имеют те же особенности в своих реализациях регулярных выражений, хотя они во многом похожи. IMSoP

Ваш Ответ

2   ответа
2

и краткий ответ «нет», то, как работают регулярные выражения, не обеспечивает способ сказать «любую трехбуквенную строку, кроме ...».

Howeverнекоторые механизмы регулярных выражений допускают так называемые «отрицательные прогнозные утверждения». Это немного сложно, чтобы получить голову -это объяснение бдительности кажется, достаточно хорошо, если немного технически.

Важной особенностью прогнозирования является то, что он имеет «нулевую ширину» - он не использует & quot; любая строка. Таким образом, в Javascript вы можете сопоставить строку следующим образом:'abc123ghi'.match(/abc(?!def)...ghi/) -(?!def) говорит, что не должно быть букв'def' после'abc', но... должен быть там, чтобы сказать, что там должны быть другие 3 символа.

Кстати, будет/abc(?!def).{3}ghi/ работать так же? wwaawaw
Да, я знал о негативном взгляде, но не был достаточно умен, чтобы придумать этот обходной путь. Во всяком случае, круто - спасибо! wwaawaw
@adlwalrus Да, это будет работать точно так же -.{3} в точности эквивалентно...
Или это будет для abc, за которым не следует def, но yes, за которым следуют три последовательных символа, которые одинаковы друг с другом? wwaawaw
0

чтобы сделать то, что вы говорите:

xyz(?!abc|def|ghi)

Это означает «xyz, за которым следует все, кроме abc, def или ghi». На самом деле он не потребляет источник, поэтому после этого вы добавляете материал, который должен продолжать совпадение после "xyz". То есть,

/xyz(?!abc|def|ghi)(\w*)/

соответствует «xyzhello», и первая группа захвата будет содержать «hello».

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