【问题标题】:notepad++ remove text between two string using regular expressionnotepad++ 使用正则表达式删除两个字符串之间的文本
【发布时间】:2018-04-17 07:16:02
【问题描述】:

我想在 notepad++ 中使用 regular expression 删除两个字符串之间的文本。这是我的完整字符串

[insertedOn]) VALUES (1, N'1F9ACCD2-3B60-49CF-830B-42B4C99F6072',

我想要这样的最终字符串

[insertedOn]) VALUES (N'1F9ACCD2-3B60-49CF-830B-42B4C99F6072',

这里我从字符串中删除了 1,1,2,3 是按递增顺序排列的。

我尝试了很多表达但没有奏效。这是其中之一(VALUES ()(?s)(.*)(, N')

我怎样才能删除它?

【问题讨论】:

  • 试试(VALUES \().*?,\s*(N') = > $1$2
  • 感谢您的回复。我试过这个(VALUES \().*?,\s*(N'),它成功了:)
  • 我发布了一个带有解释的答案。

标签: regex notepad++


【解决方案1】:

你可以使用

(VALUES \().*?,\s*(N')

并替换为$1$2。请注意,如果要删除的字符串部分可能包含换行符,请启用 . 匹配换行符。如果 NVALUES 必须仅在全大写时匹配,请确保选中 匹配大小写 选项。

模式详情

  • (VALUES \() - 第 1 组(后来用替换模式中的 $1 引用):文字子字符串 VALUES (
  • .*? - 任何 0+ 字符,尽可能少,直到最左边出现的 sunsequent 子模式
  • ,\s* - 一个逗号和 0+ 个空格(使用 \h 而不是 \s 仅匹配水平空格字符)
  • (N') - 第 2 组(后来用替换模式中的 $2 引用):文字子字符串 N'

【讨论】:

  • 一个相对次要的观点,但比起使用.*?,使用[^,]* 更好。对于这个特定的字符串并不重要,但是当你有更长的字符串要匹配时,使用惰性量词效率会降低。使用惰性量词所需的步骤是检查每个字符两次的两倍,而使用[^,] 只是匹配直到它到达,
  • 另外一个只是样式选择的事情是,在一个实例中,您在值之后使用 ` ` 表示空格,而在另一个实例中,您使用 \s。没关系,但我会选择一个并坚持下去。为了可读性,我更喜欢\s
  • @JackPRead 我明白了,我还解释说\h 可能比\s 更有用。[^,]* 是一个没有实际意义的增强功能,因为如果有@987654349,它将阻止匹配@在从VALUE (N'的路上。
  • .*?,[^,]*, 匹配完全相同的东西,只是前者需要两倍的步骤。如果像你说的那样有,,两者都会阻止匹配。正如我上面所说,尽管对于这种大小的字符串,优化可以忽略不计,并且两个正则表达式都对该字符串有效。
  • @JackPRead 不,[^,]* 无法与.*? 以相同的方式匹配此处,请参阅my regexyour variation。仅当右侧有单个原子时它们的工作方式相同(例如a.*?b = a[^b]*b)在 OP 场景中,右侧边界是一系列模式,因此,.*? 更合适。
【解决方案2】:

你应该首先在VALUES之前转义文字(\(

通过这样做,除了s (DOTALL) 标志之外,正则表达式中的.* 会导致引擎贪婪地匹配到输入字符串的结尾,然后回溯到第一次出现, N' 时停止,这意味着意外匹配.

要改进您的正则表达式,您应该 1) 使 .* 不贪婪 2) 删除 (?s) 3) 转义 (

(VALUES \().*?, (N')

为了更精确地匹配你最好搜索:

VALUES \(\K\d+, *(?=N')

然后什么都不替换。

细分:

  • VALUES \( 三月 VALUES ( 字面意思
  • \K重置匹配
  • \d+, * 匹配逗号和可选空格前的数字
  • (?=N') 后跟N'

【讨论】:

  • 感谢回复:)
猜你喜欢
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2018-01-16
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多