Regex: путаница в отношении \ b поведения - PullRequest
0 голосов
/ 24 мая 2018

Я пишу свою собственную грамматику для редактора Atom.Он использует регулярные выражения для определения кода, который должен быть выделен.

Я хочу выделить шестнадцатеричные числа в двух форматах:

$affe     // hex number with ampersand
0xeffa    // hex number with 0x

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

(\$|0x)[A-Fa-f0-9]+

Довольно просто, все отлично работает.Проблема в том, что это также выделит что-то вроде 0x0 в t0x0t.Поэтому я изменил свое регулярное выражение на

\b(\$|0x)[A-Fa-f0-9]+\b

Теперь это регулярное выражение будет соответствовать только 0xeffa, но не $affe, или любому другому номеру с префиксом $ - почему это так?Я нашел этот ответ , который, кажется, похожая проблема.Я предполагаю, что это потому, что $ не является словом.Есть ли способ изменить это регулярное выражение, чтобы оно соответствовало 0xeffa и $affe, но не 0x0 в t0x0t?

Одно из решений, которое я попытался, - просто написать два отдельных выражения регулярного выражения для каждогоcase - это работает, но, похоже, что-то побеждает цель выражений регулярных выражений.

1 Ответ

0 голосов
/ 24 мая 2018

Вам следует изменить положение, в котором применяется \b:

(\$|\b0x)[A-Fa-f0-9]+\b

В противном случае с \b перед $ двигатель ожидает, что символ слова из набора [a-zA-Z0-9_] появится непосредственно перед $, т. Е. a$af00

...