【问题标题】:match but don't select with regex匹配但不使用正则表达式选择
【发布时间】:2018-01-03 12:07:46
【问题描述】:

我试图捕获术语ISomething,仅当它之前没有紧跟句号.,但是我的搜索正在捕获前面的字母或空格。我正在使用 javascript 样式的正则表达式(确切地说是 vscode 搜索)。

我的目标是用Namespace.ISomething 替换ISomething,而不触及现有的命名空间。

Live example

我的搜索示例

Api.Resources.Things.Bits.ISomething     //doesn't match
something : ISomething
List<ISomething>
something:ISomething
isomething                               //doesn't match

我的正则表达式

[^\.](ISomething)

我的匹配,第一个捕获空格,第二个捕获箭头,第三个括号。

  ISomething
 <ISomething
 :ISomething

我如何(以及为什么)在以上所有内容中都得到ISomething这个词?

【问题讨论】:

  • 您能否澄清一下您想要实现的目标:将ISomething 替换为其他内容?然后使用 (^|[^.])ISomething 并替换为 $1 以删除这些实例。或替换为$1NEW STRING 以替换为新字符串。
  • 我的目标是用 Namespace.ISomething 替换 ISomething 而不触及现有的命名空间。

标签: regex visual-studio-code


【解决方案1】:

更新

can use infinite-width lookahead and lookbehind 从 Visual Studio Code v.1.31.0 版本开始没有任何限制,您现在不需要为此设置任何选项。

所以,解决方案可能看起来像

查找内容\b(?&lt;!\.)ISomething\b
替换为Namespace.$&amp;

(?&lt;!\.) 必须在 \b 之后才能获得更好的性能(为了不在字符串中的每个位置执行后向检查),并且是一个匹配不匹配位置的负后向检查紧跟在文字 . 之前。替换中的$&amp; 是一个完整的匹配值反向引用/占位符。

您可以使用旧版本

查找内容(^|[^.])\b(ISomething)\b
替换为$1Namespace.$2

请参阅下面的regex demo 和 VSCode 设置:

请注意Aa(区分大小写)和.*(正则表达式模式)选项必须打开。

点击全部替换后,结果为:

正则表达式详细信息

  • (^|[^.]) - 第 1 组:行/字符串的开头或除 . 之外的任何字符
  • \b - 单词边界
  • (ISomething) - 第 2 组:单词 ISomething
  • \b - 单词边界

【讨论】:

  • 这行得通!我没想到会这样,因为我不明白$1 与匹配组的关系。谢谢!
【解决方案2】:

如果支持\K 可能就是您要找的:

[^\.]\KISomething

【讨论】:

  • 我认为这只适用于 PERL 正则表达式,但感谢我仍然学到了一些新东西 :)
【解决方案3】:

你可以使用消极的向后看

(?&lt;!\.)ISomething 基本上这将匹配任何前面没有. 的 ISomething

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多