我有一个字符串需要用分号分割。最简单的方法是[^;]+
。通过使用它,字符串中的每个分号都将用作分隔符。
然而,在我们的字符串中,有一些“&”我们不想包括那个;作为分隔符。
例如,一个字符串
abcd;efg;hij&kl;mn
预期结果为abcd, efg, hij&kl, mn
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
我认为更好的方法是解码你的字符串(例如在.NET HttpUtility.HtmlDecode
方法中,我不知道你的平台),然后按;
拆分。
正则表达式:
(?<!&[^;]+);
它不仅会忽略&
,还会忽略以&
开头且以;
结尾的任何其他HTML / XML特殊符号。
答案 1 :(得分:1)
如果你的正则表达式允许它,那么使用背后的负面看法
(?<!&);
只有在&
;
时才会匹配
这是一个使用split
的Java示例String str = "abcd;efg;hij&kl;mn";
String[] Result = str.split("(?<!&);");
答案 2 :(得分:1)
如果您想匹配“真实;
s”之外的所有内容:
(?:&|[^;])+
会奏效。或(?:&\w+;|[^;])+
,如果不仅仅需要&
个实体。
如果你的正则表达式引擎支持拆分操作,也许这个正则表达式(只有在&
之前没有匹配的分号)也是个好主意
(?<!&);
如果您的正则表达式实现支持lookbehind assertions内的无限重复,也可以使用上面的其他实体(?<!&\w+);
。但大多数情况下,.NET都不是例外。
在Python中:
>>> import re
>>> re.findall("(?:&|[^;])+", "abcd;efg;hij&kl;mn")
['abcd', 'efg', 'hij&kl', 'mn']
>>> re.split("(?<!&);", "abcd;efg;hij&kl;mn")
['abcd', 'efg', 'hij&kl', 'mn']