我有一个带有标记的字符串,我需要使用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
答案 0 :(得分:8)
正则表达式应该非常有用。
请参阅您的JavaDoc
注意:StringTokenizer不是你想要的,因为它分割字符而不是字符串 - 字符串delim是一个字符列表,其中任何一个都将被拆分。这对于非常简单的案例很有用,例如明确的逗号分隔列表。
答案 1 :(得分:2)
当您想要通过特定字符串分隔字符串时,StringTokenizer将为您提供单独的标记。 或者您可以使用String中的split()方法来获取单独的字符串。要获得不同的数组,必须将正则表达式放入。
答案 2 :(得分:2)
考虑到你的例子,我认为我会使用正则表达式,特别是我会看看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);
}
答案 3 :(得分:1)
StringTokenizer将整个String作为参数,对于大字符串来说并不是一个好主意。 您也可以使用StreamTokenizer
您还需要查看Scanner。
答案 4 :(得分:1)
这有点'蛮力'并做出一些假设,但这有效。
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();
}
}
}
}
答案 5 :(得分:0)
您的输入看起来像您的示例,您需要在特定标记之间获取文本吗?然后使用apache commons lang包(http://commons.apache.org/lang/)的简单StringUtils.substringsBetween(yourString,“&lt; B&gt;”,“&lt; / B&gt;”)应该可以完成这项工作。
如果你想要一个更通用的解决方案,对于不同的和可能嵌套的标签,你可能想要查看一个解析器,它接受html输入并从中创建一个xml文档,例如NekoHTML,TagSoup,jTidy。然后,您可以在xml文档上使用XPath来访问内容。