Sublime Text片段将camelCase转换为snake_case

Eth*_*th0 1 php regex perl code-snippets sublimetext3

您好,我正在尝试制作一个崇高的文本片段,我想将一个camelCase单词转换为snake_case.我知道有插件允许你将字符串转换为snake_case但我想通过崇高的文本片段来实现.

我有一个如下所示的片段.

<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>
Run Code Online (Sandbox Code Playgroud)

作为输出它给了我.

 /**
     * 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');
    }
Run Code Online (Sandbox Code Playgroud)

我最终想要的是userMessages是user_messages.知道怎么做到这一点.

非常感谢.

Oda*_*urd 6

下面是基于您的示例执行此类操作的代码段示例,但为了清晰起见缩短了(我也将范围更改为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>
Run Code Online (Sandbox Code Playgroud)

正在使用的代码段示例

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

Boost支持条件替换的形式(?Ntrue:false),对于捕获组N,替换文本是true匹配捕获的东西,或者false如果没有.

这里我们使用正则表达式中的替换来拥有两个捕获组,以便我们可以提供两个不同的替换,具体取决于哪些项匹配.第一个捕获组捕获一个前导大写字符并将其转换为小写字母,而第二个捕获组(不锚定到行的开头)执行相同操作,并且在匹配之前也使用下划线.