繁体   English   中英

Sublime Text 片段将camelCase 转换为snake_case

[英]Sublime Text snippet convert camelCase to snake_case

嗨,我正在尝试制作一个崇高的文本片段,我想将驼峰式单词转换为蛇形大小写。 我知道有一些插件可以让你将字符串转换为 snake_case,但我想通过 sublime 文本片段来做到这一点。

我有一个像下面这样的片段。

<snippet>
    <content><![CDATA[
/**
 * ${TM_FILEPATH/^.+\/(\w+)\.php$/${1}/} belongs to many (many-to-many) ${1/^((.+)ies)|(.+[^s])s$/\u(?1$2y:$3)/}.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function $1()
{
    return \$this->belongsToMany('App\\${1/^((.+)ies)|(.+[^s])s$/\u(?1$2y:$3)/}', '${TM_FILEPATH/^.+\/(\w+)\.php$/\l${1}/}_$1', '${TM_FILEPATH/^.+\/(\w+)\.php$/\l${1}/}_id', '${1/^((.+)ies)|(.+[^s])s$/\l(?1$2y:$3)/}_id');
}
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>btm</tabTrigger>
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>source.php</scope>
    <description>Eloquent belongsToMany() (pivot) relation</description>
</snippet>

作为输出,它给了我。

 /**
     * UserMessages belongs to many (many-to-many) Role.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role', 'userMessages_roles', 'userMessages_id', 'role_id');
    }

我想要结束的是 userMessages 是 user_messages。 任何想法如何做到这一点。

非常感谢。

执行类似操作的代码段示例如下,基于您的示例,但为了清楚起见缩短了(我还将范围更改为embedding.php因此它将使用我用于 PHP 的语法触发)。 您应该能够在更大的代码片段示例中根据您的需求进行调整。

<snippet>
    <content><![CDATA[
// ${1/^([A-Z])|(?:([A-Z]))/(?1\l$1:)(?2_\l$2:)/g}
public function ${1}()
{
    $0
}
]]></content>
    <tabTrigger>btm</tabTrigger>
    <scope>embedding.php</scope>
    <description>Eloquent belongsToMany() (pivot) relation</description>
</snippet>

正在使用的代码片段示例

其基础可以在非官方文档片段页面中看到。 片段中变量的扩展采用${variable/regex/format_string/options} 正则表达式使用boost 库正则表达式格式字符串

Boost 支持(?Ntrue:false)形式的条件替换,其中对于捕获组N ,如果匹配捕获某些内容,则替换文本为true否则为false

在这里,我们在正则表达式中使用交替来拥有两个捕获组,以便我们可以根据匹配的项目提供两种不同的替换。 第一个捕获组捕获前导大写字符并将其转换为小写,而第二个捕获组(未锚定到行首)执行相同的操作,并在匹配之前使用下划线。

Perl 提供了\\L修饰符来在替换时小写捕获。 捕获在括号 () 中,可以通过 $1、$2 等进行反向引用。

所以所有需要的是找到一个小写字符后跟一个大写字符,然后应该是小写的。

sub camel_case_to_underscore {
    my $method_name = shift;   
    $method_name =~s /([a-z])([A-Z])/$1_\L$2/g;
    return lcfirst $method_name;
}

g标志全局替换,因此所有出现在字符串中。

请注意,此函数也将字符串的第一个字母小写,我认为这就是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM