拆分复杂的字符串

时间:2013-04-12 19:07:07

标签: java regex string split

我有一个这样的字符串:

1|f1|</a1|a2/></a3|a4/>|f2

我想分开'|'通过java 但我需要忽略<//>。我怎样才能做到这一点?看起来像是一个regexp方法

上面的字符串应该分成:

1

F1

A1 | A2

A3 | A4

F2

3 个答案:

答案 0 :(得分:3)

split方法使用正则表达式作为参数,而正则表达式中的|是特殊字符,表示OR。要使其正常的字符位置\\在它之前

"yourString".split("\\|");

在您的情况下,您还需要look-ahead机制,以便您的正则表达式看起来像

/></|(/>)?\\|(?=[^>]*(</|$))(</)?

它会分开

  • /></
  • |可选/>之前或</之后,但只有>之后才会</或输入结束$ { {1}}。这样可以保证|超出</ />

另外,在"</a|b/>|c|</d|e/>"开始时</和输入结束时/>等情况下摆脱问题,您需要在拆分前将其删除。

这似乎是必要的,因为我们不希望将空String作为生成数组中的第一个或最后一个元素,就像"ab".split("a")生成{"", "b"}

一样

让我们测试一下:

for (String s : "</a0|b0/>|1|f1|</a1|a2/></a3|a4/>|f2|</a5|a6/>"
        .replaceAll("^</", "").split("/></|/>$|(/>)?\\|(?=[^>]*(</|$))(</)?")) {
    System.out.println(s);
}

输出:

a0|b0
1
f1
a1|a2
a3|a4
f2
a5|a6

答案 1 :(得分:2)

您可以尝试以下使用否定look ahead的正则表达式。

(?!</[^\|]*)[\|](?![^\|]*/>)

这可以作为:

[\|]匹配|

的出现次数

(?!</[^\|]*)声明所述匹配不得以</sometext

开头

(?![^\|]*/>)声明所述匹配不得跟sometext/>

一起使用

注意:在上面的示例中,sometext是零个或多个字符,而不是|

答案 2 :(得分:1)

这个正则表达式应该匹配。 imma留下一个可能的事情列表,如果一个人失败去下一个。第一个是\ b应该转义单词绑定但java可能不需要转义转义反斜杠所以我添加了第二个。如果这两个失败都转移到最后一个。这个说它必须是资本A和普通z之间的一个字母。现在任何空间都不应该有选择。

最后一个的最终结果是匹配:

“&LT;”任何角色,多次,“&gt;”如果失败那么

匹配

任何字母或数字

"(<.*?>|[^|\\b]*)" "(<.*?>|[^|\b]*)" "(<.*?>|[A-z0-9]*)"

public String[] methodName(String s)
{
ArrayList<String>list= new ArrayList<String>();
Pattern p=Pattern.compile("(<.*?>|[^|]*)");
Matcher match=p.matcher(s);
while(match.find())
{
 list.add(match.group());
}
String[] listArray= new String[list.size()];
return listArray.toArray(listArray);
}

如果有帮助,请记得投票 欢呼队友