【发布时间】:2017-05-16 05:53:46
【问题描述】:
我想从代表方法的给定文本中提取返回值。
例如:
g: x and: y
Transcript show: x; show: y.
^x+y.
所以为了解决我使用了正则表达式:
\^\s*(\w+.*).
当我在一些正则表达式网站上运行它时,它似乎可以工作并做我想做的事,例如:https://regex101.com/
但是当我运行以下程序时,似乎 squeak 会返回 nil(找不到匹配项)。我怀疑那是因为我使用了字符^。
但我逃脱了那个角色,所以我不知道为什么它不起作用。
我用来测试它的代码:
|aString regexObj |
aString := 'g: x and: y
Transcript show: x; show: y.
^x+y.'.
regexObj := '\^\s*(\w+.*).' asRegex.
regexObj matches: aString.
returnedType:= (regexObj subexpression:2).
Transcript show: returnedType.
任何人都知道为什么,以及如何解决它?
谢谢。
【问题讨论】:
-
Aviad,你为什么要访问子表达式 2?捕获组只有一个,所以应该是
(regexObj subexpression:1) -
根据您要执行的操作,生成 AST 并访问返回节点可能更简单。例如。
(MyClass>>#myMethod) parseTree nodesDo:[ :node | ... ](未经测试)。 -
@WiktorStribiżew 从一些侧面测试并通过阅读文档,您会看到子表达式 1 将为您提供整个匹配项,而子表达式 2 将为您提供括号中的组。文档:[链接] (ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/…)
-
@MaxLeske 您能否详细解释一下,并提供如何操作的参考?谢谢!
-
@AviadShiber:很好的链接,现在更清楚了。但是,请查看文档中的代码和示例。你的应该看起来像
regexObj := '\^\s*(\w.*)\.' asRegex.=>regexObj search: aString=>regexObj subexpression: 2- 注意:search用于查找部分匹配,而matches需要整个字符串匹配。至少尝试在您的代码中将matches:替换为search:。