Java中具有可变长度零宽度后缀的正则表达式

时间:2018-10-23 20:49:31

标签: java regex regex-lookarounds

我了解到Java不支持可变长度零宽度后退,但有没有一种有效且有效的方法来模仿所需的行为?

我将正则表达式应用于的文本如下:

blah words blah [tag platform="platform1, platform5" future]Blah Blah blah[/tag] blah more words

在开始标记中,列表中可以有任意数量的平台,可以按任何顺序排列,并且可能值的数量也有限。所需的输出是获取标签之间的文本:

Blah Blah blah

这是我要代表的变量列表平台的作用:

(?<=\\[tag platform=\\\\\".*?\\\\\" future\\]).*?(?=\\[/tag\\])

当然,它会抛出异常Look-behind group does not have an obvious maximum length

我曾经考虑过使用正则表达式来获取包括标签的整个字符串(这很简单),然后解析该字符串。但这似乎太具体了,我想要一个更防弹的解决方案。

2 个答案:

答案 0 :(得分:2)

这应该为您工作。无需后视 只需“捕获”必要的部分并替换整个字符串(或其他内容)

public static void main(String[] args) {
    String s = "blah words blah [tag platform=\"platform1, platform5\" future]Blah Blah blah[/tag] blah more words";
    s = s.replaceAll(".*?\\[tag.*?\\](.*?)(?=\\[.*).*", "$1");
    System.out.println(s);
}

O / P:

Blah Blah blah

答案 1 :(得分:0)

您可以使用非捕获组在比赛中包含事物,但不能捕获 只需记住要从第一个捕获组中拉出,而不是从整个比赛中拉出

WITH SelectedData AS
(
    SELECT TOP 1 Id, Name, Title
    FROM dbo.People
    WHERE Id = 2
)
UPDATE SelectedData
SET Title = 'Manager'

On Regex101