我的英语句子的单词是XML标记的,例如:
<XXX>word1</XXX> word2 word3 <YYY>word4 word5 word6</YYY> word7 word8 word9 word10 <ZZZ>word11 word12</ZZZ>.
正如句子所示(<XXX>
,<YYY>
,<ZZZ>
),xml标签正是这三种可能性。任何这些标签内的字数都可以是无限的。
我需要在空格中拆分它们,忽略这些XML标记内的空格。代码如下:
String mySentence = "<XXX>word1</XXX> word2 word3 <YYY>word4 word5 word6</YYY> word7 word8 word9 word10 <ZZZ>word11 word12</ZZZ>.";
String[] mySentenceSplit = mySentence.split("someUnknownRegex");
for (int i = 0; i < mySentenceSplit.length; i++) {
System.out.println(mySentenceSplit[i]);
}
特别是对于上面的例子,输出应该是:
mySentenceSplit[0] = <XXX>word1</XXX>
mySentenceSplit[1] = word2
mySentenceSplit[2] = word3
mySentenceSplit[3] = <YYY>word4 word5 word6</YYY>
mySentenceSplit[4] = word7
mySentenceSplit[5] = word8
mySentenceSplit[6] = word9
mySentenceSplit[7] = word10
mySentenceSplit[8] = <ZZZ>word11 word12</ZZZ>.
我需要在“someUnknownRegex”中插入什么来实现这一目标?
答案 0 :(得分:2)
使用捕获组和反向引用:
String sentence = "<XXX>word1</XXX> word2 word3 <YYY>word4 word5 word6</YYY> word7 word8 word9 word10 <ZZZ>word11 word12</ZZZ>.";
Pattern pattern = Pattern.compile("<(\\w+)[^>]*>.*?</\\1>\\.?|\\S+");
Matcher matcher = pattern.matcher(sentence);
while (matcher.find()) {
System.out.println(matcher.group());
}
输出:
<XXX>word1</XXX>
word2
word3
<YYY>word4 word5 word6</YYY>
word7
word8
word9
word10
<ZZZ>word11 word12</ZZZ>.
答案 1 :(得分:1)
这是您想要的分割正则表达式:
String[] split = str.split(" +(?=[^<]*(<[^/]|$)");
答案 2 :(得分:0)
kiltek,重新提出这个问题,因为它有一个简单的正则表达式解决方案,没有提到。 (在为regex bounty quest进行一些研究时找到了您的问题。)
关于使用正则表达式解析xml的所有免责声明,这里有一个简单的正则表达式:
<.*?</[^>]*>|( )
交替的左侧匹配完整的xml标签。我们将忽略这些匹配。右侧匹配并捕获第1组的空格,我们知道它们是正确的空格,因为它们与左侧的表达式不匹配。
以下是工作代码(请参阅online demo):
import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;
class Program {
public static void main (String[] args) throws java.lang.Exception {
String subject = "<XXX>word1</XXX> word2 word3 <YYY>word4 word5 word6</YYY> word7 word8 word9 word10 <ZZZ>word11 word12</ZZZ>";
Pattern regex = Pattern.compile("<.*?</[^>]*>|( )");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "SplitHere");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("SplitHere");
for (String split : splits) System.out.println(split);
} // end main
} // end Program
参考