我如何在 Smalltalk 正则表达式中匹配 [?

How do I match [ in a Smalltalk regular expression?

我想在 Pharo 6 的正则表达式中匹配 [

这很好用:

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

但是,我看不到如何在 [] 中执行此操作。 [[][\[] 都不起作用。

我可以将结束 ][]] 完美匹配,但我不知道如何使用 [.

不支持

查看 RxParser>>atomRxParser>>characterSet 的实现,根本不支持范围集中的转义字符。

根据文档,其他 "special" 个字符 (^,-,]) 只能由集中的特定位置处理,因此不会触发不同分支的解析。

解决方法

解决方法是将范围集拆分为 or-ed 组,例如

[[a-z]

进入

(\[|[a-z])

更好的工具

请注意,Pharo 用户通常会被引导使用 PetitParser 而不是正则表达式来进行文本解析,因为 PetitParser 更易于管理和调试。至少可以说,一种更面向对象的正则表达式。

我正在添加一个与 GNU Smalltalk 相关的答案,因为这个问题被标记为 [smalltalk],因此可能会出现在互联网搜索结果中。

在 GNU Smalltalk 中,regexs have Perl like syntax,字符 [ 可以转义为 \[。例如:

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

转义在一定范围内也有效:

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

值得一提的是消息 =~ 可以与正则表达式一起传递给字符串。