【问题标题】:Regex to match hyphen between two specific words正则表达式匹配两个特定单词之间的连字符
【发布时间】:2016-09-23 11:59:09
【问题描述】:

鉴于以下示例,我将如何匹配单词“CAST”和“DATETIME”之间的每个连字符? (CAST(N'2013-11-26 10:52:47.957' AS DateTime))

该模式每行出现多次。 字符串中的其他任何地方都可能有连字符不能匹配。

INSERT [dbo].[tbl_Content] ([Template], [CreatedDate], [Url], [PublishedDate]) VALUES (N’gallery-item.aspx', CAST(N'2013-11-26 10:52:47.957' AS DateTime), N'some-url', CAST(N'2013-11-26 00:00:00.000' AS DateTime))
INSERT [dbo].[tbl_Content] ([Template], [CreatedDate], [Url], [PublishedDate]) VALUES (N’another-item.aspx', CAST(N'2013-11-26 10:52:47.957' AS DateTime), N'some-other-url', CAST(N'2013-11-26 00:00:00.000' AS DateTime))

CAST(.*)DateTime 选择每行中第一次出现“CAST”和最后一次出现“DATETIME”之间的所有字符。此选择中可能有其他不应匹配的连字符。

- 将匹配文档中的任何连字符。

我想我需要以某种方式将这两种模式结合起来,但我的正则表达式知识并不存在。 CAST(-)DateTime 不起作用。

这样做的正确方法是什么?

如果平台很重要:这将用于在Visual Studio Code 中进行查找替换。如果这是不可能的,我绝对愿意使用另一个文本/代码编辑器。

【问题讨论】:

  • 这取决于您使用的工具/正则表达式库。
  • 嗨@WiktorStribiżew,我想在Visual Studio Code 的查找替换中使用它。恐怕我不知道他们在后台使用哪个库
  • 抱歉,这是不可能的,因为 VSC 使用 ECMAScript 5 正则表达式。
  • “CAST(.*)DateTime 选择每行第一次出现“CAST”和最后一次出现“DATETIME”之间的所有字符” - 这是因为正则表达式是“贪婪的。”所以你需要为 .* 部分切换到非贪婪模式。 (我不知道 regex Visual Studio 使用的是什么“风格”,所以你需要自己去看看那里是如何做到的。)
  • 如果在数字周围选择连字符怎么办?意思是:regex101.com/r/dB2fB3/1

标签: regex


【解决方案1】:

如果您可以使用 Notepad++,则可以使用基于 \G 运算符的正则表达式,该运算符有助于在初始匹配后查找连续匹配。

使用

(?:\bCAST\b|(?!^)\G)(?:(?!\b(?:DATETIME|CAST)\b)[^-])*\K-

并替换为您想要的任何符号(请记住,括号必须在 NPP 替换模式中进行转义)。下面,我将- 替换为§

详情

  • (?:\bCAST\b|(?!^)\G) - 一个完整的单词 CAST 或上一个匹配的结束位置
  • (?:(?!\b(?:DATETIME|CAST)\b)[^-])* - 一个缓和的贪婪令牌,匹配除- 之外的任何字符(请参阅[^-]),它不会以整个单词的序列DATETIMECAST 开头(请参阅否定的前瞻(?!\b(?:DATETIME|CAST)\b)
  • \K - 匹配重置操作符:到目前为止匹配的所有文本都被丢弃
  • - - 我们要匹配的连字符

【讨论】:

  • 这很奏效。谢谢你。您让我不必编辑 4000 多个插入语句。
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多