我有一个字符串,里面有某种元数据"描述"字符串的一部分。
示例:
This is an {TypeAStart}arbitrary long{TypeAEnd} text which has {TypeBStart}various{TypeBEnd} usages
我想要的是获取这些标签中包含的字符串的索引 我的第一个想法是:
String[] tags = [ "{TypeA", "{TypeB", etc ];
for(String tag:tags) {
int start = mainString.indexOf(tag + "Start");
if(start != -1) {
int end = mainString.indexOf(tag + "End}", start);
// store somewhere start,end
}
}
但我认为这种方法很容易出错并容易出错。如何使用正则表达式有效地完成此操作?
更新
我提到这个字符串,这些元数据是要应用样式的标记
因此,在上面的示例字符串中,我需要以某种方式拥有一个单独的数据结构,以便"描述" TypeA
适用于来自"arbitrary long"
的字符串,位于第23-36位。
我的主要目标是将原始字符串剥离标记,并在另一个数据结构中删除索引和样式。
答案 0 :(得分:2)
像这样的工作。但是,它假设标签已正确配对,否则将返回包含错误嵌入标签的完整内容。
pattern = Pattern.compile("\\{((\\w+)Start)\\}(.*?)\\{(\\2End)\\}");
Matcher matcher = pattern.matches(input);
while (matcher.find()) {
// matcher.start(1) matcher.end(1) matcher.group(1) return index of start of opening tag, its end and content
// similarly for end tag - start(4) etc.
// similarly for tag content - start(3) etc.
// group(2) returns just the tag name
String result = matcher.group(3);
// do something with result
}
答案 1 :(得分:0)
您可以使用m.start()
和m.end()
找到模式匹配的开始和结束。
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
String str = "This is an {TypeAStart}arbitrary long{TypeAEnd} text which has {TypeBStart}various{TypeBEnd} usages";
Pattern p = Pattern.compile("\\{(.*?)\\}");
Matcher m = p.matcher(str);
while(m.find())
{
System.out.print(m.group(1));
System.out.print(" - ");
System.out.println(m.start() + " : " + m.end());
}
}
}
使用以下正则表达式Pattern.compile("\\{(.*?)\\}");
我指定了您拥有的起始和结束分隔符,例如{
和}
。 m.group(1)
只是简化所有调查结果。
结果:
TypeAStart - 11 : 23
TypeAEnd - 37 : 47
TypeBStart - 63 : 75
TypeBEnd - 82 : 92