6

我有一个这样的字符串:

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

我想用'|'分割 通过 java 但我需要忽略</and />。我怎样才能做到这一点?似乎是一个正则表达式方法

上面的字符串应该分成:

1

f1

a1|a2

a3|a4

f2

4

3 回答 3

3

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

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

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

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

它会分裂

  • /></
  • |/>在它之前或之后是可选的</,但只有在它>之后没有,直到</你的输入结束$。这将保证|</ />

此外,为了摆脱在输入开始和结束时出现的问题,您需要在拆分之前将其删除"</a|b/>|c|</d|e/>"<//>

这似乎是必要的,因为我们不想产生空字符串作为产生的数组中的第一个或最后一个元素,就像万一"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
于 2013-04-12T19:30:23.783 回答
2

您可以尝试以下使用否定前瞻的正则表达式

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

结果如下:

[\|]匹配的出现|

(?!</[^\|]*)声明所述匹配不能在前面</sometext

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

注意:在上面的例子sometext中是零个或多个不是|

于 2013-04-12T19:28:15.977 回答
1

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

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

"<" 任何字符,多次,">" 如果失败则

匹配:

任何字母或数字的字符

"(<.*?>|[^|\\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);
}

记得投票如果它有助于欢呼队友

于 2013-04-12T19:20:08.653 回答