重复属性regex简化

时间:2014-04-30 14:09:25

标签: java regex simplify

我在代码库中寻找重复的属性,我把一个表达式放在一起起作用,但我想知道它是否可以变得更简单或更符合逻辑。

示例输入

test.append("<td class='no-order' style='text-align:center;' class=\"data text\">");

我的尝试

<([^>]*)(class=('|\\")[^('|\\")]+('|\\"))([^>]*)(class=('|\\")[^('|\\")]+('|\\"))([^>]*)>

我的想法是寻找一个开始标记<,然后查找不是结束标记[^>]*的任何内容,后跟带有'\"的类属性,然后重复整件事。

正如你所看到的,即使它有效,它看起来很长很复杂,它们是一种更简单的方式吗?

修改

对于以替换全部形式编写它的人来说,超级奖金布朗尼积分,所以它在运行后结合了属性值

3 个答案:

答案 0 :(得分:4)

您可以使用以下正则表达式:

<.+(class)=("|').+?\2.+?\1.+>

在使用前撤消正则表达式。

如果它是matches字符串,则包含重复项。否则,它没有。

说明:

<.+(class)=("|')匹配<加上任何字符,直到达到class=单引号或双引号。

正则表达式的其余部分匹配值,如果字符串在使用反向引用的某个位置再次包含class

答案 1 :(得分:1)

只需使用class=("|')检查多个类属性。

示例代码:

    String str = "test.append(\"<td class='no-order' style='text-align:center;' class=\"data text\">\");";

    Pattern pattern = Pattern.compile("class=(\"|')");
    Matcher matcher = pattern.matcher(str);
    int index = 0;
    while (matcher.find()) {
        index++;
    }

    if (index > 1) {
        System.out.println("multiple class attribute found");
    }

输出:

multiple class attribute found

答案 2 :(得分:0)

在Amit Joki建议的基础上,如果你想确保它可以使用相同的元素:

main

添加<.+(class)=("|').+?\2[^>]+?\1.+>将确保您的第二个类属性将位于相同的元素中,因为它将匹配除标记结束之外的任何内容。