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

时间:2017-12-05 17:04:18

标签: regex extjs sublimetext3

上下文

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

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

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

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

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

  

  public string Email { get; set; }

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

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

<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' },

问题

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

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

我认为创建一个匹配空格的组和从主组目标字符串中排除它可以解决问题,但我不知道该如何做到这一点,事实是正则表达式我生成的是跟踪错误方法,因为我是regex的初学者。

我正在寻求帮助来删除该空间,这对RegExp专家来说可能是一项简单的任务。

1 个答案:

答案 0 :(得分: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中填充
  • /结束替换

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

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

<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的命名捕获组。