Как мне сопоставить [в регулярном выражении Smalltalk?

Я хочу соответствовать [ в регулярном выражении в Pharo 6.

Это отлично работает:

| matcher |
matcher := RxMatcher forString: '\['.
matcher matches: '['. "produces true"

Тем не менее, я не вижу, как это сделать внутри [], ни [[] ни [\[] Работа.

Я могу соответствовать закрытию ] хорошо с []], но я не могу понять, как это сделать с [,

2 ответа

Решение

Не поддерживается

Глядя на реализацию RxParser>>atom а также RxParser>>characterSetэкранирование символов в наборе диапазонов просто не поддерживается.

Согласно документации, другие "специальные" символы (^,-,]) могут обрабатываться только определенным размещением в наборе, чтобы не запускать разбор другой ветви.

Временное решение

Обходным решением будет разделить диапазон, установленный на группу или группу, например

[[a-z]

в

(\[|[a-z])

Лучший инструмент

Обратите внимание, что пользователи Pharo обычно должны использовать PetitParser вместо регулярных выражений для разбора текста, поскольку PetitParser проще в управлении и отладке. Это своего рода более объектно-ориентированные регулярные выражения, если не сказать больше.

Я добавляю ответ, связанный с GNU Smalltalk, потому что вопрос помечен как [smalltalk] и, следовательно, может появиться в результатах поиска в Интернете.

В GNU Smalltalk регулярные выражения имеют Perl, подобный synta x, и символ [ можно избежать как \[, Например:

st> '[ac' =~ '\[[ab]' 
MatchingRegexResults:'[a'
st> '[bc' =~ '\[[ab]' 
MatchingRegexResults:'[b'

Экранирование работает также в пределах диапазона:

st> '[bc' =~ '[\[b]' 
MatchingRegexResults:'['

Что, вероятно, стоит упомянуть, что сообщение =~ может быть передан в строку вместе с регулярным выражением.

Другие вопросы по тегам