2

私はこの正規表現を使用して、文字列に千の区切り文字を入れます。

while matchstr(mystr, '\(\d\)\(\d\{3}\)\(\D\|\s\|$\)') != ''
    let mystr = substitute(mystr, '\(\d\)\(\d\{3}\)\(\D\|\s\|$\)', '\1.\2\3', 'g')
endwhile

にとって

let mystr = '2000000'

上記のコードは

2.000.000

問題は、小数点記号がある場合、小数点記号(以下、コンマ)の後の数値の小数部分にも1000個の区切り文字を配置することです。

例えば、

let mystr = '2000000,2346'

につながる

2.000.000,2.346

私はそれをしたい間

2.000.000,2346

上記のコードを適応させようとしましたが、満足のいく解決策が見つかりませんでした。誰か助けてもらえますか?

4

2 に答える 2

1

substitute()質問にリストされているループ全体の代わりに、次の関数の呼び出しを使用します。

substitute(s, '\(\d,\d*\)\@<!\d\ze\(\d\{3}\)\+\d\@!', '&.', 'g')
于 2012-05-06T02:09:04.380 に答える
0

これを試してください(正の整数でのみ機能します):

で検索

(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))

と置換する

,

私はvimそれがうまくいくかどうかを試していません。ただし、パターンはPCRE互換です。


説明

<!--
(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))

Options: case insensitive; ^ and $ match at line breaks

Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) «(?<=[0-9])»
   Match a single character in the range between “0” and “9” «[0-9]»
Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=(?:[0-9]{3})+(?![0-9]))»
   Match the regular expression below «(?:[0-9]{3})+»
      Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
      Match a single character in the range between “0” and “9” «[0-9]{3}»
         Exactly 3 times «{3}»
   Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?![0-9])»
      Match a single character in the range between “0” and “9” «[0-9]»
-->
于 2012-05-05T10:45:11.527 に答える