通过正则表达式按;而不是amp;拆分字符串

3

我有一个需要用分号拆分的字符串。最简单的方法是使用[^;]+。通过使用这种方式,字符串中的每个分号都会被用作定界符。

然而,在我们的字符串中,有一些"&",我们不希望将其作为分隔符包含在内。

例如,一个字符串:

abcd;efg;hij&kl;mn

期望的结果应该是abcd, efg, hij&kl, mn 有人能帮我解决这个问题吗?
3个回答

3
我认为更好的方法是解码您的字符串(例如在.NET平台上使用 HttpUtility.HtmlDecode 方法,我不知道您使用的平台),然后按 ; 进行分割。
正则表达式:
(?<!&[^;]+);

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

这是一种很好的方法,但由于代码的限制,我无法执行对字符串的解码操作。不管怎样,还是谢谢。 - Yudong Li

1
如果您的正则表达式支持,可以使用负向后瞻。
(?<!&amp);

在Regexr上在线查看

只有在分号前没有&amp时才会匹配

这里是一个使用split的Java示例

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

1

如果你想匹配除了 "real ;s" 之外的所有内容:

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

如果只需要匹配&amp;实体,则可以使用&amp;(?!#\d+;)正则表达式。或者,如果需要匹配多个实体,则可以使用(?:&\w+;|[^;])+

如果您的正则表达式引擎支持拆分操作,那么也许这个正则表达式(仅在不以&amp;为前缀时匹配分号)也是一个好主意。

(?<!&amp);

为了允许像上面这样的其他实体,如果您的正则表达式实现支持后行断言中的非确定重复,则可以使用(?<!&\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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接