如何从RegEx分组中“排除”空白区域?

问题描述 投票:-1回答:1

上下文

我是一名从事ExtJS框架工作的前端开发人员,为了提高速度,我创建了许多Sublime Text 3的代码片段来激发工作。

任务的模型来自C#平台的后端,包含var的类型和名称。

然后我想到了简单地复制模型内容并用它的字符串产生一个等于ExtJS模型模式的新字符串。

在Snippet代码中,我没有使用任何编程语言(因为它不可能),我只使用正则表达式解决方案生成输出字符串,这是我可以做的唯一一件事,因为Sublime Text片段限制。

Codes

一行C#模型代码的示例是:

  public string Email { get; set; }

模型的所有线都遵循该模式。

目前,我的Sublime Text 3 Snippet包含以下代码:

<snippet>
    <content><![CDATA[
    { name: '${SELECTION/(        public )|(public )|({ get; set; })|(\w)|( \w+)|( )/(?5$5/\s/)/g}', type: '${SELECTION/(        public )|(public )|({ get; set; })|(\ \$w\ \w.)|( \w+)|( )/(?1)(?2)(?3)(?4\$5\$6\)($5)($6)/g}' },
]]></content>
    <tabTrigger>modelnames</tabTrigger>
</snippet>

PS:${SELECTION} var是一个片段var,它获取触发片段时选择的字符串。使用我的代码段选择的示例字符串产生的字符串是:

  { type: 'string', name: ' Email' },

Problem

正如你在上面所看到的,我得到了几乎完美的结果,但我的问题是在Email之前的空白区域。

我已经尝试过数百万种不同的组合,但是我是正则表达式的初学者而无法解决这个问题。

我认为创建一个匹配空格并将其从主要组目标字符串中排除的组可以解决问题,但我不知道如何准确地执行此操作,事实是我生成的正则表达式是在路径上 - -error方法,因为我是regex的初学者。

我要求帮助只删除那个空间,这可能是一个简单的任务给RegExp专家。

regex extjs sublimetext3
1个回答
1
投票

你可以使用:

<snippet>
    <content><![CDATA[
    { ${SELECTION/\s*\bpublic\s+([\w<>]+)\s+(\w+).*/'name': '$2', 'type': '$1'/} },
]]></content>
    <tabTrigger>modelnames</tabTrigger>
</snippet>

哪个会输出

    { 'name': 'Email', 'type': 'string' },

为你举例说明

        public string Email { get; set; }

这个怎么运作:

  • \s*\bpublic - 匹配任意数量的空白字符,后跟一个单词边界,然后是public
  • \s+匹配至少一个空格字符
  • ([\w<>]+)匹配至少一个单词字符或尖括号(以支持泛型类型,以防它有用)并将结果存储到捕获组1中
  • \s+匹配至少一个空格字符
  • (\w+)匹配至少一个单词字符(标识符)并将结果存储到捕获组2中
  • .*与剩下的选择相匹配
  • /开始更换
  • 'name': '$2', 'type': '$1'替换,其中$1将从捕获组1中填充,而$2来自捕获组2
  • /结束替换

我没有包含global标志,因为这个正则表达式只需要每行/选择匹配一次。

实际上,我们可以让它替换你选择的所有这些行:

<snippet>
    <content><![CDATA[
${SELECTION/\s*\bpublic\s+([\w<>]+)\s+(\w+).*?(\n|$)/    \{ 'name': '$2', 'type': '$1' \},\n/g}
]]></content>
    <tabTrigger>modelnames</tabTrigger>
</snippet>

会转换

        public string Email { get; set; }
        public string Name { get; set; }

    { 'name': 'Email', 'type': 'string' },
    { 'name': 'Name', 'type': 'string' },

编辑:根据有关映射类型的评论中的反馈,这里是新的代码段内容:

<snippet>
    <content><![CDATA[
${SELECTION/\s*\bpublic\s+(?:(DateTime)|(bool)|(decimal)|([\w<>]+))\s+(?<name>\w+).*?(\n|$)/    \{ name: '$+{name}', type: '(?1date)(?2boolean)(?3float)(?4$4)' \},\n/g}
]]></content>
    <tabTrigger>modelnames</tabTrigger>
</snippet>

字符串替换格式记录在http://www.boost.org/doc/libs/1_51_0/libs/regex/doc/html/boost_regex/format/boost_format_syntax.html

在这里,为了简单起见,我使用了一个名为name的命名捕获组。

© www.soinside.com 2019 - 2024. All rights reserved.