在 Squeak (Smalltalk) 中提取 return 值

Extracting the return value in Squeak (Smalltalk)

我想从表示方法的给定文本中提取 return 值。

例如:

g: x and: y
Transcript show: x; show: y.
^x+y.

所以为了解决我使用了正则表达式:

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

当我 运行 在某些正则表达式网站上使用它时,它似乎可以正常工作并做我想做的事,例如:https://regex101.com/

但是当我 运行 下面的程序时,它似乎发出 returns 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.

谁知道为什么,如何解决?

谢谢。

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

matches: aString — true if the whole argument string (aString) matches.

search: aString — Search the string for the first occurrence of a matching substring. Note that the first two methods only try matching from the very beginning of the string. Using the above example with a matcher for a+, this method would answer success given a string 'baaa', while the previous two would fail.

前两种方法指的是matches(需要全字符串匹配)和matchesPrefix(将匹配锚定在输入的开头细绳)。 search 允许在字符串中的任意位置匹配模式

关于正则表达式的注意事项:最后的 . 未转义并匹配任何非换行字符。您应该将其转义以匹配文字点:

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

参见regex demo

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