我有一个带有标记的字符串,需要使用Java。在字符串中找到特定标记的最佳方法是什么?
例如。
string = abc<B>def</B>ghi<B>j</B>kl
desired output..
segment [n] = start, end
segment [1] = 4, 6
segment [2] = 10, 10
我有一个带有标记的字符串,需要使用Java。在字符串中找到特定标记的最佳方法是什么?
例如。
string = abc<B>def</B>ghi<B>j</B>kl
desired output..
segment [n] = start, end
segment [1] = 4, 6
segment [2] = 10, 10
正则表达式应该为此工作出色。
请参阅您的JavaDoc
注:StringTokenizer的不你想要什么,因为它分裂字符,而不是字符串 - 字符串delim是一个字符的列表,其中任何一个将分裂。对于非常简单的情况(如明确的逗号分隔列表)非常有用。
当您想要通过特定字符串分隔字符串时,StringTokenizer会为您提供单独的标记。 或者您也可以使用String中的split()方法来获取单独的字符串。为了获得不同的数组,你必须将正则表达式放入。
感谢马库斯.. 参考我发现这个.. StringTokenizer是一个遗留类,由于兼容性的原因而被保留,尽管它在新代码中的使用不受欢迎。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。 – pro 2009-01-06 10:28:47
StringTokenizer分割*字符*,而不是字符串 - 字符串delim是一个字符列表,其中任何一个字符都会被分割。对于非常简单的情况(如明确的逗号分隔列表)非常有用。 – 2009-01-06 10:43:43
StringTokenizer将整个字符串作为参数,对于大字符串并不是一个好主意。 您还可以使用StreamTokenizer
您还需要查看Scanner。
鉴于你的例子,我想我会使用正则表达式,特别是我会看看Matcher提供的分组功能。
汤姆
String inputString = "abc<B>def</B>ghi<B>j</B>kl";
String stringPattern = "(<B>)([a-zA-Z]+)(<\\/B>)";
Pattern pattern = Pattern.compile(stringPattern);
Matcher matcher = pattern.matcher(inputString);
if (matcher.matches()) {
String firstGroup = matcher.group(1);
String secondGroup = matcher.group(2);
String thirdGroup = matcher.group(3);
}
这是一个有点“蛮力”,并做了一些假设,但这个工程。
public class SegmentFinder
{
public static void main(String[] args)
{
String string = "abc<B>def</B>ghi<B>j</B>kl";
String startRegExp = "<B>";
String endRegExp = "</B>";
int segmentCounter = 0;
int currentPos = 0;
String[] array = string.split(startRegExp);
for (int i = 0; i < array.length; i++)
{
if (i > 0) // Ignore the first one
{
segmentCounter++;
//this assumes that every start will have exactly one end
String[] array2 = array[i].split(endRegExp);
int elementLenght = array2[0].length();
System.out.println("segment["+segmentCounter +"] = "+ (currentPos+1) +","+ (currentPos+elementLenght));
for(String s : array2)
{
currentPos += s.length();
}
}
else
{
currentPos += array[i].length();
}
}
}
}
您的输入看起来像您的示例,您需要获取特定标记之间的文本吗?然后使用apache commons lang包(http://commons.apache.org/lang/)执行简单的StringUtils.substringsBetween(yourString,“< B>”,“</B>”)。
如果您正在寻找一种更通用的解决方案,对于不同的或可能嵌套的标签,您可能需要查看采用html输入并创建xml文档的解析器,例如NekoHTML,TagSoup,jTidy 。然后,您可以在xml文档上使用XPath来访问内容。
看起来像从java.util.regex包加上一些简单的数学正则表达式是走在这条 – pro 2009-01-06 10:30:59
或更好的方式一样[^ <]+一个正则表达式匹配每个段 – pro 2009-01-06 12:11:28