java regex或其他在字符串和该字符串的其他部分之间查找字符串的方法

时间:2016-06-24 10:33:06

标签: java regex string

我有一个像这样的字符串

String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO ;

我希望在之间提取字符串,并按照正确的顺序构造一个StringBuilder,其中包含字符串的所有部分。我这样做是因为我需要识别和本地化提取的字符串,但我需要保留整个字符串。 所有这些工作的目的是稍后在excel工作表单元格中添加整个String,并在

之间添加字符串的字体
XSSFRichTextString xssfrt = new XSSFRichTextString(); // acts like a StringBuilder
    xssfrt .append("AZERTY");
    xssfrt .append("ZA" , font); //extract 1
    xssfrt .append(" QWERTY OK "); // keep spaces
    xssfrt .append("NE" , font); //extract 2
    xssfrt .append("NO");

有我的正则表达式可以提取所需的字符串,但我不知道如何构造StringBuilder所有部分的顺序正确:/

Pattern p = Pattern.compile("\\<em>(.*?)\\</em>");
            Matcher m = p.matcher(value);
            while(m.find())
            {
                m.group(1); //extracts
            }

非常感谢

4 个答案:

答案 0 :(得分:2)

一个简单的修复方法是添加另一个组以匹配<em>之前的字符串:

Pattern p = Pattern.compile("(.*?)<em>(.*?)</em>");

有了它,m.group(1)引用了em之外的字符串,m.group(2)就是里面的字符串。

当然,这不包括em之外的最后一个字符串(在您的示例中为NO)。因此,您可能想要记住匹配结束的最后一个索引,例如: int end = m.end(),并检索s.substring(end)

答案 1 :(得分:1)

您可以使用Matcher's appendReplacement(StringBuffer sb,String replacement)和appendTail(StringBuffer sb)函数来保持它的顺序。并有一个列表,将存储提取的字符串。像这样的东西

public static void main(String[] args) throws java.lang.Exception {
    String s = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
    String matchedString = null;
    List<String> extractedString = new ArrayList<String>();
    Pattern p = Pattern.compile("\\<em>(.*?)\\</em>");
    Matcher m = p.matcher(s);
    StringBuffer sb = new StringBuffer();

    while (m.find()) {

        matchedString = m.group(1);
        extractedString.add(matchedString);
        m.appendReplacement(sb, matchedString);
        sb.append(" ");

    }
    m.appendTail(sb);

    System.out.println(sb.toString());
    System.out.println(extractedString.toString());
}
Output :
String buffer = AZERTYZA  QWERTY OK NE NO
List of extracted String = [ZA, NE]

答案 2 :(得分:0)

String[] pieces = s.split("<.*?>")

这会将字符串拆分为<>所包围的任何内容。 如果您的代码始终为em,那么您可以使用:

String[] pieces = s.split("</?em>")

答案 3 :(得分:0)

您需要执行以下操作:

        String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";
        StringBuilder stringBuilder = new StringBuilder();
        String[] parts = str.split("(<\\/?em>)");

        System.out.println("parts : "+Arrays.toString(parts));

        for(String s:parts){
            System.out.println("Part going to append :"+s);
            stringBuilder.append(s);
        }
        System.out.println("StringBuilder : "+stringBuilder.toString());
    }

输出将是:

> parts : [AZERTY, ZA,  QWERTY OK , NE, NO] Part going to append :AZERTY
> Part going to append :ZA Part going to append : QWERTY OK  Part going
> to append :NE Part going to append :NO StringBuilder : AZERTYZA QWERTY
> OK NENO

更新: -

检查更新的代码:

String str = "AZERTY<em>ZA</em> QWERTY OK <em>NE</em>NO";

        //replace word in string which is preceded by <\em> to word:font eg. ZA:font
        str = str.replaceAll("(\\w+)(?=\\<\\/em\\>)", "$1:font");
   // After replace :AZERTY<em>ZA:font</em> QWERTY OK <em>NE:font</em>NO

        String[] parts = str.split("(<\\/?em>)");
 // After split : [AZERTY, ZA:font,  QWERTY OK , NE:font, NO]   

        XSSFRichTextString xssfrt = new XSSFRichTextString();

        for(String s:parts){
            //set font according to replace string
            if(s.contains(":")){
                String[] subParts = s.split(":");
                xssfrt.append(subParts[0], /**check the subParts[0] and set the font***/ );
            }else{
                xssfrt.append(s);
            }
        }
    }
相关问题