如何在记事本中找到两个字符之间的文本并将其替换为一行的另外两个字符之间的文本?

时间:2019-12-26 15:22:55

标签: notepad++

我的书目行很多,如下:

@article{mehri_buckling_2016, title = {Buckling }, doi = {10.1016/j.cma.2016.01.017}}

@article{jin_modified_2014, title = {A modified ns}, doi = {10.1016/j.apacoust.2014.04.007}}

@article{sofiyev_free_2017, title = {The free}, doi = {10.1016/j.compositesb.2017.03.054}}

@article{malekzadeh_three-dimensional_2012, title = {Three-dimensional free }}

@article{jooybar_thermal_2016, title = {Thermal panels}, doi = {10.1016/j.tws.2016.01.032}}

每行中可能都没有doi={...}。 如果行中有doi,我需要用@article{......之间的单词替换doi = {...}之间的单词。

对于此示例,结果应为:

@article{10.1016/j.cma.2016.01.017, title = {Buckling }, doi = {10.1016/j.cma.2016.01.017}}

@article{10.1016/j.apacoust.2014.04.007, title = {A modified ns}, doi = {10.1016/j.apacoust.2014.04.007}}

@article{10.1016/j.compositesb.2017.03.054, title = {The free}, doi = {10.1016/j.compositesb.2017.03.054}}

@article{malekzadeh_three-dimensional_2012, title = {Three-dimensional free }}

@article{10.1016/j.tws.2016.01.032, title = {Thermal panels}, doi = {10.1016/j.tws.2016.01.032}}

1 个答案:

答案 0 :(得分:3)

您可以这样做:

  • 查找内容:^(@article\{).*?(,.*?doi = \{)(.*?)\}
  • 替换为:\1\3\2\3}
  • 正则表达式:已选中
  • .与换行符匹配:已清除

说明:

  • ^可能是可选的,但它确保匹配只能发生在行的开头。
  • (@article\{)从字面上匹配@article{。大括号必须用反斜杠转义,因为它是正则表达式中的特殊字符。括号使以后可以使用\1来引用此字符串。这就是所谓的“捕获小组”
  • .*?将匹配任意一系列字符,但不超过完全匹配(“惰性”)所需的字符:.表示任何字符,*表示任意数量的字符, ?,但要使其余的工作尽可能少。
  • (,.*?doi = \{)匹配一个文字逗号,然后再匹配一些字符(请参见上一点),然后是一个文字doi = {。括号使以后可以将其称为\2
  • (.*?)匹配多个字符(请参见上文)。括号使以后可以将其称为\3。这是与需要复制的实际文本相匹配的部分。
  • \}文字}

替换使用捕获组:

  • \1@article{的同义词
  • \3是需要复制的文本
  • \2,doi = {之间出现的任何内容,包括这两个文本。
  • 重复
  • \3只是恢复doi值。
  • }是在“查找”模式末尾匹配的右括号。我们当然也希望保留它。