2

特に、これはJavascriptで可能ですか?

>> "Version 1.2.3.4".match(/\S+ (\d+)(\.\d+)*/)
["Version 1.2.3.4", "1", ".4"]

$2が最後のKleene-「マッチ」に設定されるのは明らかです。残り(".2"".3")を取得するための組み込みメソッドはありませんか?

これがJSで簡単に実行できない場合、Perlで実行できますか?

更新:これまでの回答の多くは、私の例が単純であるために機能する「回避策」でした。私が一致させたいと繰り返した部分が単なる数字以上のものである場合、それらは機能しません。

ただし、非常に有効な解決策が存在します。/expr/gグローバル正規表現マッチングを使用します。繰り返し部分を除外してそれを使用するだけです。これは、より一般的に適用可能なオペレーターよりも柔軟性がやや劣ることがわかります*が、ほとんどの場合、明らかに仕事が完了します。

4

4 に答える 4

3

JavaScriptの正規表現は、他のほとんどの正規表現フレーバーと同様に、キャプチャグループの最後の値が繰り返し一致する場合にのみキャプチャします。以前に一致したすべてのキャプチャにアクセスできる、よく知られている唯一の正規表現ライブラリ(私が知っている)は、.NETのものです。

いいえ、JSではこれを行うことはできません。

Perlでは、そのようなことを達成する方法がいくつかあります。よりエレガントなものの1つは、おそらく使用することです\G(PCREでも機能します)。

例えば:

"Version 1.2.3.4" =~ /(?:\S+ |\G(?!^)\.)(\d+)/g

戻り値(リストコンテキストで):

(1, 2, 3, 4)
于 2012-06-28T22:40:27.553 に答える
1

バージョン文字列全体を一致させてから、で分割してみ.ませんか?

>> "Version 1.2.3.4".match(/\S+ (\d+(?:\.\d+)*)/)[1].split('.')
于 2012-06-28T19:30:04.237 に答える
0

正規\.?\d+表現は必要なものを返しますが、1つだけでなく、すべての一致に対してこの正規表現を実行する必要があります...

var n=str.match(/\.?\d+/g); 

先頭にドットを付けずに数字だけを一致させたい場合は、正規表現を使用して\d+ください。

var n=str.match(/\d+/g); 
于 2012-06-28T19:23:37.417 に答える
0

バージョン番号の文字列全体をキャプチャしてから、ピリオド文字で分割するだけです。

整数に一致する正規表現:/((?:\d+)(?:\.\d+)*)/

split次に、結果のキャプチャを呼び出すだけです。

于 2012-06-28T19:26:46.470 に答える