2012-01-15 16 views
0

EDIT:作業正規表現(第2のグループを取る):Haskellの正規表現の構文

(^|[ ,\t\n]+)([0-9\\.]+)($|[ ,\t\n]+) 

オリジナルのポスト:

私はregex-からText.Regexを(使用しようと、ハスケルに新たなんですcompat)を使用して、文字列から浮動小数点値を抽出します。私は、正規表現が、少なくとも1つの区切り文字で左右に並んでいる数字とピリオドに一致するようにしたい。

regex = "[^ \t\n,]+([0-9\\.])+[$ \t\n,]+" 

EDITを:私はもともとこれはScalaで適切に働いていたと思ったが、私は今、私は単に私のテスト文字列と幸運と信じてこれは私が書いたものです。これはハスケルでは機能しません。例:

matchRegexAll (mkRegex regex) " 12.34 " 

利回り

Just (" ","12.34 ","",["4"]) 

それは私には思えるとき、それはもう一つの例

Just (""," 12.34 ","",["12.34"]) 

が得られるはずです:

matchRegexAll (mkRegex regex) "12.34" 

を生み出します
Nothing 

それは私はそれが私がScalaのパーサをしている異なったパーサが扱う「^」と「$」を推測しているが、それは私が持っているすべてです

Just ("","12.34","",["12.34"]) 

が得られるはずだと思うとき。

+2

もし、その正規表現で期待していることをScalaが行うのであれば、その正規表現エンジンは壊れていなければなりません。 – kennytm

答えて

3

のような文字クラス内では、通常の正規表現メタキャラクタ(^$など)は特別な意味を失います。彼らは代わりに自分自身と一致します。 (^|[ \t\n,])のようなものは、あなたがしたいことをする必要があります。

私はあなたの正規表現がScalaで動作するのに驚いています。私はこのような振る舞いをしない正規表現の実装を見たことがない。 FlopCoderが指摘するようものの

^文字クラスの開始時に、実際にそれを否定します。

+0

私は '[^ \ t \ n、]'はスペース、タブ、改行、カンマ以外のすべてを意味すると思います。これはRubyで動作し、Regexpの構文で最もよく知られています。 – Hauleth

3

[]内部のシンボル^ませを意味します。このを使用すると、[]の間のの他の文字は除外されます。正規表現を最初から一致させたい場合は、^を正規表現の冒頭に入力してください。

$の場合は、文字列の末尾として使用する場合は同じことが起こります。

1

この"[^ \t\n,]+([0-9\\.])+[$ \t\n,]+"は配列の最後から二番目を捕捉する、貪欲' ', '\t', '\n', ',']のいずれでない文字の空でないシーケンス、数字またはドットの空でないシーケンス、及び"$ \t\n,"の任意の空でないシーケンスと一致します。最初の数字は" 12.3"、最後の最後から2番目の文字は"4"になります。