【问题标题】:RegEx search and replace in Eclipse over multiple lines with start and middle and end正则表达式在 Eclipse 中搜索和替换多行开始、中间和结束
【发布时间】:2013-08-08 14:06:31
【问题描述】:

我正在努力为以下情况提出一个好的正则表达式搜索和替换。 我正在从 RichFaces 3 迁移到 RichFaces 4,到目前为止,我能够使用正则表达式进行很多更改。

我有这样的东西:

     <a:ajax execute="@this"
    rendered="whatever" action="#{bean.method} 
someotherstuff="whatever"
    />

我想要做的是将上面的 action= 替换为 listener= 但不更改任何其他内容,我只想在 a:ajax 标记中执行此操作。属性的顺序和出现可能会有所不同。

所以我基本上需要这样的搜索和替换:

<a:ajax(SEARCH1)action="(.+?)"(SEARCH2)/>

替换为

<a:ajax$1listener="$2"$3/>

任何想法。我想我可能需要前瞻,但我还没有使用它

更新:已接受的解决方案在 Eclipse 中可以用于搜索,但是在 Eclipse 中存在一个已知错误,即当您使用环视时替换不起作用:https://bugs.eclipse.org/bugs/show_bug.cgi?id=109481

【问题讨论】:

  • (?s)&lt;a:ajax(.+?)action="(.+?)"(.+?)/&gt; 有什么问题? (忘记了s 修饰符:)
  • 只是想澄清一下-您的问题只是关于正则表达式而不是如何用这些表达式进行替换?
  • @HamZa 至少有一件事 - &lt;a:ajax&gt; abcaction="stuff" &lt;a:ajax ... /&gt;。虽然我不知道给定数据是否会发生这样的事情。 [^&gt;] 而不是 . 可能是一个更好的主意。
  • @Dukeling 好吧,这取决于输入...
  • 嗨 HamZa,查询是一个好的开始,但它似乎有点过于“贪婪”。它在下一个 /> 结束,但不是来自 a:ajax 的那个。另一个问题是如果你有一个没有 action= 的 。它会从那个

标签: regex eclipse


【解决方案1】:

如果您想在 a:ajax 标记内将 action= 替换为 listener=,您将需要向后查找而不是向前查找。并且您必须注意,java中的lookbehind意味着您必须定义lookbehind范围的最大长度。

类似于(?&lt;=a:ajax[\w\W\n]{1,100})action=" 的通配符范围在 1 到 100 之间,如果需要,可以通过更改 {1,100} 来增加它。

你可以的

.replaceAll("(?&lt;=a:ajax[\\w\\W\\n]{1,100})action=\"","listener=\"")

关于正则表达式后视的注意事项:

  • Java 允许有限重复。你仍然不能使用星星或 另外,但您可以将问号和花括号与 指定最大参数。
  • JGsoft引擎和.NET框架RegEx类,可以做完整的正则表达式 内部回顾。
  • Javascript 不支持后视。
  • Python 只能在lookbehind 内部使用固定长度。

【讨论】:

  • 仅供参考大多数正则表达式引擎无法处理:您必须在后视中指定 固定 长度。唯一能做到这一点的语言是 .NET
  • 不,当 .net 能够无限向后查看 + and * 时,java 可以使用范围。我认为他说的是 eclipse,这就是我认为他使用 java regex 引擎的原因。
  • 不错,但是如果您将后视范围增加太多,您可能会得到误报。我已将搜索更改为 (?
猜你喜欢
  • 2014-10-19
  • 2018-11-10
  • 2010-11-25
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多