【问题标题】:Regular expression word1.word2 -> word2 in Eclipse find-replace dialogEclipse 查找替换对话框中的正则表达式 word1.word2 -> word2
【发布时间】:2014-10-08 07:11:12
【问题描述】:

我正在尝试使用查找替换对话框 (Ctr-F) 在 eclipse 中进行一些字符串替换,但我什至不确定是否可以在单个操作中完成...

假设我正在编辑一个文本文件,其中包含一组单词对(单词对中的单词由点分隔,对由逗号分隔),例如

{word1.word2,word3.word4,wordn.wordm,...}  

我想找到所有匹配这个模式的字符串并将其替换为 对中所有第二个单词的列表,例如

{word2,word4,wordm,...}

这是否可以通过单个查找-替换操作来实现,如果可以,查找和替换表达式是什么?

显然在查找替换对话框中,我会检查正则表达式并替换所有复选框

【问题讨论】:

  • 这对单词是否包含在花括号中({})?如果是,它出现在单行还是延伸到多行?
  • 不,花括号中包含一组对。一对示例是字符串“word1.word2”。每组都在一行上(但为什么这很重要?)

标签: regex eclipse


【解决方案1】:

这不是防弹的,但试试这个:

Search: (?<=\{|,)\w+\.(?=\w+(,|\}))
Replace: <blank>

假设 Eclipse 支持环视,但由于 known bug 而在替换时不支持环视。将环视转换为捕获并简单地将捕获的文本放回原处,这是可行的(经过测试):

Search: (\{|,)\w+\.(\w+(,|\}))
Replace: $1$2

【讨论】:

  • 搜索字符串似乎找到了正确的东西。但是,无论我输入什么替换字符串,替换都不会发生。当我点击 Find - 似乎找到下一个 但点击 Replace 没有做任何事情。 Find-Replace All 也不执行任何操作
  • 您正在查看的导入库的源文件或资源文件是否以 jar 的形式提供,因此不可编辑?
  • 我在一个普通的可编辑源文件中尝试了上述操作。也许这是 Eclipse 中的一个错误
  • 看起来像 Eclipse 中的一个错误。如果我全部替换它会以“ 匹配替换”响应,其中 n 是正确的,但文件中没有更改。因此,即使它目前不起作用,我也会升级您的答案,但仍在寻找有人提出可行的解决方案或解决方法
  • 我自己试过了,结果一模一样。我做了一些挖掘,你的怀疑是正确的 - 这是一个 known bug with eclipse,如果正则表达式使用环视,它不会取代它。幸运的是,通过将环视转换为捕获并替换它们,可以在不使用环视的情况下解决此问题。见编辑
【解决方案2】:

您可以为此使用groups。搜索([^{.,]+)\.([^{.,]+),然后使用\2$2 作为替换模式。

正则表达式部分周围的() 告诉它将此部分作为一个组来记住。然后,您可以按编号访问每个组。 $0 是一个特殊的组,它等于整个匹配的输入。

如果您嵌套组,则只需计算 ( 即可找到要使用的数字:

a((1)?(2)?)b

第 1 组:1?2?
第 2 组:1?
第三组:2?

【讨论】:

  • 但是,为此,您不必知道组的数量并在替换字符串中明确说明 $n 中的每一个吗?因为我不知道有多少,所以不能这样做。如果我错了,请将上面的替换指定两个字符串(查找和替换字符串)
  • @inor:正则表达式有效,因为您有一对由, 分隔的单词。我的正则表达式匹配整个长列表中的一对,然后保留第二个单词。应用它几次以摆脱所有第一个单词或使用Replace All
  • 我需要它以我指定的模式工作(大括号和所有东西)。如果我全部替换,它将替换大括号外的单词对......我正在寻找一个我可以使用全部替换的reg exp,但它只会对我指定的模式进行
  • @inor:选择文档中您希望发生这种情况的部分。查找对话框具有将其操作限制为当前选择的选项。如果你做不到,那么你需要编写一个程序来做到这一点;简单的正则表达式对于这个用例来说不够强大。
  • 谢谢,但我不想选择每个模式并进行查找替换。我想为整个文件做一次。似乎@Bohemian 上面给出的答案是正确的 reg expr'n 但由于某种原因替换不起作用......
猜你喜欢
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多