在Java中,对于像foo <on> bar </on> thing <on> again</on> now
这样的文本,我应该想要一个带有组的正则表达式,它给我一个查找“foo”,“bar”,空字符串,然后“thing”,“again”,“现在”。
如果我(.*?)<on>(.*?)</on>(?!<on>)
,我只会得到两个小组( foo bar,再次,而我现在还没有结束“)。
如果我(.*?)<on>(.*?)</on>((?!<on>))
我得到 foo bar空字符串,然后再次出现空字符串(这里我想要“现在”)。
请问神奇的公式是什么?
感谢。
答案 0 :(得分:2)
如果您坚持使用正则表达式执行此操作,那么您可以尝试使用\s*<[^>]*>\s*
作为分隔符:
String text = "foo <on> bar </on> thing <on> again</on> now";
String[] parts = text.split("\\s*<[^>]*>\\s*");
System.out.println(java.util.Arrays.toString(parts));
// "[foo, bar, thing, again, now]"
我不确定这是否正是你所需要的,因为它并不完全清楚。
也许这样的事情是必需的:
String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10";
String[] parts = text.split("\\s*</?on>\\s*|<[^>]*>[^>]*>");
System.out.println(java.util.Arrays.toString(parts));
// prints "[1, 2, 3, 5, 7, 8, , 10]"
这不处理嵌套标记。如果你有这些,你真的想要转储正则表达式并使用实际的HTML解析器。
如果您不希望数组中间有空字符串,那么只需(?:delimiter)+
。
String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10";
String[] parts = text.split("(?:\\s*</?on>\\s*|<[^>]*>[^>]*>)+");
System.out.println(java.util.Arrays.toString(parts));
// prints "[1, 2, 3, 5, 7, 8, 10]"
答案 1 :(得分:0)
我的建议
<on>
之前和</on>
<on>
和下一个</on>
Matcher.find()
的循环对所有出现的顺序进行排序。没有必要一次性使用一个大的脂肪正则表达式!