Как мне сопоставить [в регулярном выражении 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:'['
Что, вероятно, стоит упомянуть, что сообщение =~
может быть передан в строку вместе с регулярным выражением.