在论坛上看到过几次这样的问题,就写了点放到这里吧 :)
Java的正则引擎(java.util.regex)做不到未知层次递归匹配,再说这个用正则效率不会高,所以考虑其他方法实现。对于.Net平台,可尝试一下这个正则:^[^<>]*(?:<(?!/)(?<o>[^/s<>]+)(?:/s[^<>]*)?(?:(?<-o>/>)|>)[^<>]*|(?<-o><//k<o>>[^<>]*))*(?(o)(?!))$ (若闭合返回true,否则返回false。不会忽略单双引号之间的内容,标签也不可以交叉)
如果要求严格可用xml方式验证,如<div id="test"name="test2"></div>(属性间没空格)等是不能通过的。如果不需要这么严格则可试一下下面的方法(忽略单双引号之间的内容,标签可以交叉):
若用ArrayList存放提取出来的标签效率不佳,就自己写一个TagsList,如下:
/**
* 存放提取出来的标签
* @author Liw
* @time 2007-6
*/
import java.util.Arrays;
class TagsList
{
private String[] data;
private int size = 0;
public TagsList(int size)
{
data = new String[size];
}
public TagsList()
{
this(10);
}
public void add(String str)
{
ensureCapacity(size + 1);
data[size++] = str;
}
public String get(int index)
{
if (index < size)
return data[index];
else
return null;
}
//为了提高效率,只将其置为null
public boolean remove(String str)
{
for (int index = size - 1; index >= 0; index--) {
if (str.equals(data[index])) {
data[index] = null;
return true;
}
}
return false;
}
public boolean remove(int index)
{
if (index < data.length) {
data[index] = null;
return true;
}
* 存放提取出来的标签
* @author Liw
* @time 2007-6
*/
import java.util.Arrays;
class TagsList
{
private String[] data;
private int size = 0;
public TagsList(int size)
{
data = new String[size];
}
public TagsList()
{
this(10);
}
public void add(String str)
{
ensureCapacity(size + 1);
data[size++] = str;
}
public String get(int index)
{
if (index < size)
return data[index];
else
return null;
}
//为了提高效率,只将其置为null
public boolean remove(String str)
{
for (int index = size - 1; index >= 0; index--) {
if (str.equals(data[index])) {
data[index] = null;
return true;
}
}
return false;
}
public boolean remove(int index)
{
if (index < data.length) {
data[index] = null;
return true;
}