正则表达式将字符串拆分为;但不是安培;

时间:2011-09-14 10:28:40

标签: regex

我有一个字符串需要用分号分割。最简单的方法是[^;]+。通过使用它,字符串中的每个分号都将用作分隔符。

然而,在我们的字符串中,有一些“&”我们不想包括那个;作为分隔符。

例如,一个字符串

abcd;efg;hij&kl;mn

预期结果为abcd, efg, hij&kl, mn

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

我认为更好的方法是解码你的字符串(例如在.NET HttpUtility.HtmlDecode方法中,我不知道你的平台),然后按;拆分。

正则表达式:

(?<!&[^;]+);

它不仅会忽略&amp;,还会忽略以&开头且以;结尾的任何其他HTML / XML特殊符号。

答案 1 :(得分:1)

如果你的正则表达式允许它,那么使用背后的负面看法

(?<!&amp);

here online on Regexr

只有在&amp

之前没有;时才会匹配

这是一个使用split

的Java示例
String str = "abcd;efg;hij&amp;kl;mn";
String[] Result = str.split("(?<!&amp);");

答案 2 :(得分:1)

如果您想匹配“真实; s”之外的所有内容:

(?:&amp;|[^;])+

会奏效。或(?:&\w+;|[^;])+,如果不仅仅需要&amp;个实体。

如果你的正则表达式引擎支持拆分操作,也许这个正则表达式(只有在&amp之前没有匹配的分号)也是个好主意

(?<!&amp);

如果您的正则表达式实现支持lookbehind assertions内的无限重复,也可以使用上面的其他实体(?<!&\w+);。但大多数情况下,.NET都不是例外。

在Python中:

>>> import re
>>> re.findall("(?:&amp;|[^;])+", "abcd;efg;hij&amp;kl;mn")
['abcd', 'efg', 'hij&amp;kl', 'mn']
>>> re.split("(?<!&amp);", "abcd;efg;hij&amp;kl;mn")
['abcd', 'efg', 'hij&amp;kl', 'mn']