Java 正则表达式替换两组

Java 正则表达式替换两组,java,regex,replace,Java,Regex,Replace,我有这样的模式:]*(?:poster | src)=(['\“])([^'\“]+)\\1[^>]*> 这里我想替换src或poster属性的值 没问题 <video src='srcVal' /> 有人知道怎么做吗?基本问题是表达式开头附近的[^>]*。因为*是贪婪的,所以这将消耗尽可能多的字符,同时仍然允许表达式的其余部分匹配,因此给定 <video poster='posterVal' src='srcVal' /> 但正如其他海报所评论的那样,使用理解语言的

我有这样的模式:
]*(?:poster | src)=(['\“])([^'\“]+)\\1[^>]*>
这里我想替换src或poster属性的值

没问题

<video src='srcVal' />

有人知道怎么做吗?

基本问题是表达式开头附近的
[^>]*
。因为
*
是贪婪的,所以这将消耗尽可能多的字符,同时仍然允许表达式的其余部分匹配,因此给定

<video poster='posterVal' src='srcVal' />

但正如其他海报所评论的那样,使用理解语言的适当解析器比试图用正则表达式操纵文本表示更明智。

我不会用正则表达式这样做,但您可以尝试这样做:

<[a-zA-Z]*[^>]*(?:(poster)|src)=(['\"])([^'\"]+)\\2(?(1)[^>]*(?:src=(['\"])([^'\"]+)\\4)?[^>]*|[^>]*(?:poster=(['\"])([^'\"]+)\\6)?[^>]*)>
]*(?:(poster)| src=(['\'])([^'\']+)\\2(?(1)[^>]*(?:src=(['\'])([^'\']+)\\4)?[^>]*[^>]*(?:poster=(['\'])([^'\']+)\\6)?[^>]*)>
虽然我现在没有时间测试,抱歉

编辑:
不太注重性能:

<[a-zA-Z]*(?=(?:[^>]*?poster=['\"]([^'\"]+))?)(?=(?:[^>]*?src=['\"]([^'\"]+))?)[^>]*(?:poster|src)[^>]*>
]*?poster=['\']([^'\']+)?(?=(?:[^>]*?src=['\']([^'\']+))?)[^>]*(?:poster | src)[^>]>
如果您只想匹配视频标签,请将其更改为(因为这将大大改进它):

]*?poster=['\']([^'\']+)?(?=(?:[^>]*?src=['\']([^'\']+))?)[^>]*(?:poster | src)[^>]>
解释:(我想这看起来一定很令人不安)

我们使用2个lookahead来捕捉有趣的内容。Lookaheads允许我们检查两次前面的内容,因此忽略订单。然而,这些lookaheads必须始终有效(使用*和?来确保这一点),但仍然是贪婪的,同时又是懒惰的(什么?):我们必须在看到poster/src时立即停止,但要走得足够远才能抓住它们<代码>*?一个?总是什么也抓不到。所以我们在这里使用
(?:.*a)?
。这里的行为是试图用懒惰来抓住a,如果失败了,这不是问题。
正则表达式的最后一部分是确保我们只捕获带有poster或src属性的标记,因为我们的lookahead只能捕获,当然不能用于捕获


请注意,我删除了对属性的检查,因为无论如何它都是无用的。

尝试查看此处:当您关心语言的结构而不是文本的精确表示时,我不建议使用regexp。也就是说,您正在解析一种XML方言,在XML中属性的顺序并不重要,但是regexp不能轻松地表示“顺序不重要”。使用真正的XML库,有很多可供选择。它们不容易,但仍然可以。Lookaheads和conditional regex是两个可以用来实现这些目标的工具。我接受@drquicksilver的建议。我将使用xml解析器和xpath来更改值。因此,不可能用单一的模式实现这样的事情。就像在gangqinlaohu推荐的教程中一样,它可以通过使用更多的模式来实现。这不是他的问题。无论顺序如何,他都想捕获这两个元素。如果我有一个像src=“my.png”这样的html,它将改变纯文本,不仅仅是元素属性。我想我理解你想要做什么,但它会抱怨(?(1)…)部分。谢谢。该死,我以为Java支持条件正则表达式。我会仔细考虑的。
<video poster='posterVal' src='srcVal' />
html.replaceAll("\\b((?:poster|src)=)(['\"])([^'\"]+)\\1", "$1$2$3Changed$2")
<[a-zA-Z]*[^>]*(?:(poster)|src)=(['\"])([^'\"]+)\\2(?(1)[^>]*(?:src=(['\"])([^'\"]+)\\4)?[^>]*|[^>]*(?:poster=(['\"])([^'\"]+)\\6)?[^>]*)>
<[a-zA-Z]*(?=(?:[^>]*?poster=['\"]([^'\"]+))?)(?=(?:[^>]*?src=['\"]([^'\"]+))?)[^>]*(?:poster|src)[^>]*>
<video(?=(?:[^>]*?poster=['\"]([^'\"]+))?)(?=(?:[^>]*?src=['\"]([^'\"]+))?)[^>]*(?:poster|src)[^>]*>