【问题标题】:Extracting the return value in Squeak (Smalltalk)在 Squeak (Smalltalk) 中提取返回值
【发布时间】: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:

标签: regex smalltalk squeak


【解决方案1】:

您需要将方法从matches 替换为search。见139.6. Matching

matches: aString — 如果整个参数字符串 (aString) 匹配,则为 true。

search: aString — 在字符串中搜索第一次出现的匹配子字符串。请注意,前两种方法仅尝试从字符串的最开头进行匹配。使用上面的例子和a+ 的匹配器,这个 给定字符串'baaa',方法将回答成功,而前两个将失败。

前两个方法指的是matches(需要完整的字符串匹配)和matchesPrefix(将匹配锚定在输入字符串的开头)。 search 允许匹配字符串中的模式anywhere

关于您的正则表达式的注释:最后的 . 没有转义,并且匹配任何非换行符字符。您应该转义它以匹配文字点:

'\^\s*(\w.*)\.'

请参阅regex demo

另外,\s 匹配跨行匹配。如果您不想要它,请将\s 替换为\h(仅匹配水平空格的PCRE 模式)。注意.* 模式:它将匹配除换行符之外的任何 0+ 字符,尽可能许多,因此,它将匹配匹配行上的最后一个 . .

【讨论】:

  • 谢谢!我真的很想念它,现在对我来说更清楚了:)
  • 我不知道为什么,但是通过搜索可以捕获比需要更多的信息,例如:{code} |aString regexObj returnedType | aString:='g: x and: y "@Private" 成绩单显示:x;显示:是的。 ^ x+y 。 "@ArgsTypes: SmallInteger, SmallInteger。"@RetType: Boolean"'. regexObj := '\^\s*(.+)\.' asRegex.regexObj 搜索:aString.returnedType:= (regexObj subexpression:2). Transcript show: returnedType. {code} 和 \h 在 squeak 中不起作用。
  • 据说它使用 PCRE 正则表达式风格。如果不支持\h,那就不对了。正如我所指出的,.* 匹配尽可能多的字符。也许你需要.*??您能否分享一个 regex101.com 小提琴来展示这个问题?
  • 使用以下正则表达式修复它:\^([^.]*)\。在 regex101 中,现在只在 smalltalk 中显示了问题。
  • 是的,只要让它不贪心。 [^.]* 匹配除点以外的 0+ 个字符,因此它将补足到 first 点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多