2017-05-16 18 views
1

メソッドを表すテキストから戻り値を抽出します。例えばSqueak(Smalltalk)での戻り値の抽出

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. 

誰もが知っている、なぜ、どのようにそれを解決するために?

ありがとうございました。

+0

Aviad、なぜサブ表現* 2 *にアクセスしようとしましたか?キャプチャグループは1つしかないので、 '(regexObj subexpression:1) 'にする必要があります。 –

+2

あなたがやろうとしていることによっては、ASTを生成してリターンノードにアクセスする方が簡単かもしれません。例えば。 '(MyClass >>#myMethod)parseTree nodesDo:[:node | ...] '(テストされていない)。 –

+0

@WiktorStribiżewいくつかの側のテストから、ドキュメントを読むことによって、サブ式1はあなたに全体の一致を与え、サブ式2はあなたに括弧内のグループを与えます。 ドキュメント:[リンク](https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/Regex/Regex.html) –

答えて

3

matchesからsearchに変更する必要があります。 139.6. Matchingを参照してください:

matches: aString - 真の全体の引数文字列(aString)が一致した場合。

search: aString - 一致するサブストリングの最初に出現する文字列を検索します。最初の2つのメソッドは、文字列の最初からマッチングのみを試みることに注意してください。前の二つは失敗するだろうがa+ため、整合して上記の例を使用して、この 方法は、文字列'baaa'与えられた成功を答えるでしょう。

最初の2つの方法は、(入力文字列の先頭に一致アンカー)(完全な文字列の一致を必要とする)matchesmatchesPrefixを指します。 searchは、の文字列の中のどこでものパターンに一致させることができます。あなたの正規表現の

注:最終.を脱出し、任意の非改行文字と一致していません。あなたは文字通りのドットと一致するように、それをエスケープする必要があります

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

regex demoを参照してください。

また、\sは一致する行に一致します。必要がない場合は、\s\h(水平空白にのみ一致するPCREパターン)に置き換えます。.*パターンに注意してください。改行文字以外の0以上の文字と一致する場合は、と多くはとなるため、一致する行の最後の.まで一致します。

+1

ありがとう! 私は本当にそれを逃して、今私ははるかにはっきりしています:) –

+0

私は理由を知ってはいませんが、より多くの情報をキャッチする必要があります例: {code} | aString regexObj returnedType | aString:= 'g:xと:y 「@Private」トランスクリプトの表示:x;ショー:y。 ^ x + y。 「@ArgsTypes:SmallInteger、 SmallInteger 。 "@RetType:ブール"」 regexObj:= '(。+)。\^\ sの* \' asRegex regexObj検索:aStringの returnedType:=(regexObjの部分式:2) トランスクリプト表示:。returnedType {コード} 及び\ hはきしみに動作しない –

+0

PCRE正規表現のフレーバーを使用し書かれています。私が指摘したように、 '。*'は可能な限り多くの文字とマッチします。もしあなたが '。* 'を必要とするかもしれませんか?http:// regex101を共有してください。この問題を表示するには –

関連する問題