我有一个这样的字符串:
1|f1|</a1|a2/></a3|a4/>|f2
我想分开'|'通过java
但我需要忽略</
和/>
。我怎样才能做到这一点?看起来像是一个regexp方法
上面的字符串应该分成:
1
F1
A1 | A2
A3 | A4
F2
答案 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);
}
如果有帮助,请记得投票 欢呼队友