我如何在 Smalltalk 正则表达式中匹配 [?
How do I match [ in a Smalltalk regular expression?
我想在 Pharo 6 的正则表达式中匹配 [
。
这很好用:
| matcher |
matcher := RxMatcher forString: '\['.
matcher matches: '['. "produces true"
但是,我看不到如何在 []
中执行此操作。 [[]
和 [\[]
都不起作用。
我可以将结束 ]
与 []]
完美匹配,但我不知道如何使用 [
.
不支持
查看 RxParser>>atom
和 RxParser>>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:'['
值得一提的是消息 =~
可以与正则表达式一起传递给字符串。
我想在 Pharo 6 的正则表达式中匹配 [
。
这很好用:
| matcher |
matcher := RxMatcher forString: '\['.
matcher matches: '['. "produces true"
但是,我看不到如何在 []
中执行此操作。 [[]
和 [\[]
都不起作用。
我可以将结束 ]
与 []]
完美匹配,但我不知道如何使用 [
.
不支持
查看 RxParser>>atom
和 RxParser>>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:'['
值得一提的是消息 =~
可以与正则表达式一起传递给字符串。