2016-01-27 7 views
5

JavaScript importのSublimeText snippetを記述しようとしています。ダッシュで区切られた小文字にキャメルケースを変更する単一の正規表現

import MyFooBar from 'my-foo-bar'; 

私の正規表現の入力はMyFooBarであり、出力はmy-foo-barする必要があります:私は、フォーマット形式は次のようになりたいです。私はほとんどRegex - CamelCase to lower case with underscoresで働くの答えを見つけた:

((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)

ため

検索を答えはちょうどのためのJavaScriptの.toLowerCase()メソッドを使用するように言わ

-$1$2

と交換lowercaseですが、SublimeTextスニペットはpを使用しますエル、私は知識の中で最も簡単です。クイック検索では、小文字の場合は交換の冒頭で\Lを使用できます。

/((?<=.)[A-Z][a-zA-Z0-9]*)|((?<=[a-zA-Z])\d+)/\L-\1\2/g 

これは、すべてが、最初のセグメントの文字で動作しますので、MyFooBarMy-foo-barになります。

おそらく私は2つの正規表現を連続して実行できると思っていましたが、perlまたはSublimeのいずれかがそれを認識しません。

思考?

編集:

私はそれがPerlを使用して言うとき、私はちょうどそれがPerlの正規表現を使用しています意味。私が知る限り、私は実際には任意のコードを実行することはできません。 perlが実行できる正規表現しか指定できません。

ここに私のスニペットの全文です:(substr()

<snippet> 
    <content><![CDATA[ 
import ${1:module} from '${2:./path/}${1/((?<=.)[A-Z][a-zA-Z0-9]*)|((?<=[a-zA-Z])\d+)/\L-\1\2/g}'; 
]]></content> 
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet --> 
    <tabTrigger>import</tabTrigger> 
    <!-- Optional: Set a scope to limit where the snippet will trigger --> 
    <scope>source.js</scope> 
</snippet> 
+1

を更新しましたか?これは、適切な検索と置換機能によってより簡単に処理されます。これはperlが持っています。 – cat

+0

@cat私はスニペットの作成方法を学んでいますが、http://sublimetext.info/docs/en/extensibility/ snippets.html#置換は、置換を行う1つの方法しか示していません。 – dfoverdx

+1

@anubhava最後の文はここで問題になります。 2つの正規表現を実行して、最初の文字の「エラー」を修正します。これは明らかに機能しません。 – Christoph

答えて

1

RegExをもっと便利で、おそらく単純に変更しました。それは*正規表現であることを*しているのはなぜ

**

<snippet> 
    <content><![CDATA[ 
import ${1:module} from '${2:./path/}${1/(^[A-Z][a-z]+|[a-z])([A-Z])/\L\1-\2/g}'; 
]]></content> 
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet --> 
    <tabTrigger>import</tabTrigger> 
    <scope>source.js</scope> 
</snippet> 
+0

私のモジュールファイル名。私はそれを削除することができますが、それは基本的には最初に大文字にした文字を置き換えてやる必要があります。 – dfoverdx

+0

@dfoverdxああ、そうだけど、余分なダッシュが消えることを「入力」すれば! – revo

+0

それは私のためではない奇妙な...実際には、私は入力を押すと、それは両方のスポットでregex'dの値を入力したものを置き換えます。 – dfoverdx

0

醜いはなく、作品:

$x = "MyFooBar"; 
$x =~ s/(?:^|(?<=[a-z])(?=[A-Z]))(.)/-lc($1)/eg; 
$x = substr($x, 1); 
print $x; 
// my-foo-bar 

ideone.comのデモを参照してください。

+0

Upvoteしかし、あなたがMyFooBarIDのようなものを渡すのはどうですか? – lintmouse

0

この1つは私に少し時間がかかりましたが、私はそれがすべて、単一の正規表現の中に、あなたは何をしたいん信じる:

use warnings; 
use strict; 

while (<DATA>){ 
    chomp; 
    s/([[:upper:]].*?)(?=(?:[[:upper:]]|$))/$+[0]!=length($_) ? lc($1).'-' : lc($1)/ge; 
    print "$_\n"; 
} 

__DATA__ 
MyCamelCase 
AVeryLongCamelCaseStringWMXThat 

出力:

my-camel-case 
a-very-long-camel-case-string-w-m-x-that 

説明:それは、上を探しますその文字を他のすべての文字と共に0幅の先読み内に別の大文字または文字列の終わりが見えるまで$1にキャプチャします。置換側では、/e修飾子を使用します。これは、右側が式(実行可能コード)であることを意味します。最新のマッチ($+[0])の終わりが文字列の長さよりも短い場合は、より低い値(lc())と-を追加します。文字列の長さが最後の一致の終わりと同じであれば、それを小文字にして終了します。

+0

これは、Sublimeのスニペットが実際にPerlを解釈していないために機能しません--- PCRE構文を使用しているだけです。 –

+0

私はそれをコピーしてスニペットに貼り付け、それを実行しました。 'import MyFooBar from './path/My[1]!=length$_-1? lcMy。 '':lcMyFoo [1]!=長さ$ _- 1? lcFoo。 '':lcFooBar [1]!=長さ$ _- 1? lcBar。 '':lcBar '; '良い試みです! – dfoverdx

+0

ああhrap :)私は実行していないコードについての部分を逃した。 – stevieb

関連する問題