我在代码库中寻找重复的属性,我把一个表达式放在一起起作用,但我想知道它是否可以变得更简单或更符合逻辑。
示例输入
test.append("<td class='no-order' style='text-align:center;' class=\"data text\">");
我的尝试
<([^>]*)(class=('|\\")[^('|\\")]+('|\\"))([^>]*)(class=('|\\")[^('|\\")]+('|\\"))([^>]*)>
我的想法是寻找一个开始标记<
,然后查找不是结束标记[^>]*
的任何内容,后跟带有'
或\"
的类属性,然后重复整件事。
正如你所看到的,即使它有效,它看起来很长很复杂,它们是一种更简单的方式吗?
修改
对于以替换全部形式编写它的人来说,超级奖金布朗尼积分,所以它在运行后结合了属性值答案 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.+>
将确保您的第二个类属性将位于相同的元素中,因为它将匹配除标记结束之外的任何内容。