提取字符串的位置并将信息与此部分相关联

时间:2015-10-27 20:12:32

标签: java regex string data-structures

我有一个字符串,里面有某种元数据"描述"字符串的一部分。
示例:

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位。

我的主要目标是将原始字符串剥离标记,并在另一个数据结构中删除索引和样式。

2 个答案:

答案 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()找到模式匹配的开始和结束。

现场演示:http://ideone.com/jp1Ptn

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