【问题标题】:In lines starting with specific word followed by words separated by semicolon, replace semicolon with a comma and wrap the words in double quotes在以特定单词开头后跟用分号分隔的单词的行中,用逗号替换分号并将单词用双引号引起来
【发布时间】:2017-09-19 22:55:03
【问题描述】:

我正在尝试使用 notepad++ 更改文件中的某些行,但我对正则表达式的了解非常少,因此寻求帮助。 任何形式的帮助都是可观的。

找到所有类似于 See ABC'D EFG;IJKL;FOO;BAR;XXXXson on. 的行

  1. 以单词"See"开头的行
  2. 后面的单词都是大写的,用分号隔开
  3. 单词可以有特殊字符

    a)空格

    b) '(撇号)

    c) ,(逗号)

    d) - (hiphen)

  4. 以句号结尾.

并将这些行替换为:

See:["ABC'D EFG","IJKL","FOO","BAR",....]

【问题讨论】:

  • 你的英语不错,但可能不清楚。您要引用以分号分隔的每个术语吗?如果该行有多个分号会怎样?

标签: regex replace notepad++


【解决方案1】:

假设分号的数量是可变的。您需要分两次进行。
使用Replace All 进行两次传递:

查找:^See \K([A-Z ,;'-]+)\.
替换:["$1"]

然后:

查找:(?:\G(?!^)|^See \["(?=[^"]*"]))[^";]*\K;
替换:", "

第一遍很容易理解,它只找到对应的行,去掉最后的点,用大写字母、逗号、空格、分号、撇号和连字符在双引号和方括号之间括起来。

第二遍只需要替换引号内的分号和以See 开头的行的方括号。为此,我使用第二个分支 ^See \["(?=[^"]*"]) 来到达有趣的行,并在第二个分支中使用 \G 锚点,以确保下一个匹配项与第一个匹配项连续。由于[^";]*不包括双引号,一旦到达最后一个分号,第一个分支就不能再成功,连续性被破坏。

【讨论】:

  • @user3471526:我不明白你的评论,有什么问题?
【解决方案2】:

使用匹配任何非单词字符的\W

示例https://regex101.com/r/lFANF0/4

查找 See\s([A-Z' ]+)\W(\w+)\.替换 See:["$1","$2"]

1stGroup (\w+\'\w+\s+) \w+ 匹配任何单词字符(等于[a-zA-Z0-9_]
+ 匹配一次到无限次
\s+ 匹配任何空白字符(等于[\r\n\t\f\v ]
第二组 (\w+\W*\w+) \W* 匹配任何非单词字符(等于 [^a-zA-Z0-9_]

【讨论】:

  • 再查题,搜索字符串中有一些参数你漏掉了……
【解决方案3】:

找到什么:See ([A-Z'\-, ]+)\;([A-Z'\-, ]+)\.
替换为:See:["\1", "\2"]
https://regex101.com/r/bfJkN6/3
也在我的记事本++上进行了测试,得到了 See:["ABC'D EFG", "IJKL"]
我更新了正则表达式以捕获https://regex101.com/r/bfJkN6/5
See ((([A-Z'\-, ]+)\;)+)([A-Z'\-, ]+)\. 上的多次点击

【讨论】:

  • 非常感谢,它也对我有用。非常抱歉,我没有提到也可能有“n”个分号。所以,我认为它仅限于一个分号大小写。
  • 我编辑了我的回复以使用相同的正则表达式捕获多次点击。不幸的是,我对记事本++不够熟悉,无法告诉您如何对其进行后期处理。正则表达式将为您提供 3 个变量 - 一个具有 n-1 个匹配项,一个具有最后一个匹配项,一个具有最后一个匹配项(您不需要)。脚本语言至少需要一行来执行此处理,所以我怀疑记事本会给你更好的结果......
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2014-03-31
  • 2015-08-18
  • 2012-06-11
相关资源
最近更新 更多