我有一个像这样的字符串
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
}
非常感谢
答案 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);
}
}
}