从字符类中减去元素

3

有没有一种方法可以从另一个字符类中减去字符或字符范围?

我需要在字符串中查找子字符串,该子字符串应仅包含字符,但不包括“<”和“>”。

[[:print:]] - ('<' | '>')

由于"<"和">"是分隔符,不应该出现在字符串本身中。
<abc> // valid
<ab<c> // invalid
<ab\tc> //invalid

1
你正在尝试使用正则表达式解析HTML吗? - Ignacio Vazquez-Abrams
我不确定你在问什么。你想要移除 <> 字符,还是你想要移除任何看起来像 <example> 的字符串? - eykanal
如果你想知道:我想解析NTriples文件(http://www.w3.org/2001/sw/RDFCore/ntriples/),这也回答了第二个问题。我想获取三部分三元组。也许我可以用另一种方式解决它(在CR、LF或CRLF处拆分),但如果有人能解决这个问题,那就太棒了,因为过去有时候我也会错过一些东西。 - KingCrunch
你使用哪些函数?是使用POSIX ERE还是PCRE - Gumbo
2个回答

4

[:print:]相当于[\x20-\x7E],所以如果您不想匹配<\x3C)和>\x3E),可以使用[\x20-\x3B\x3D\x3F-\x7E]

这将匹配字符串中可打印的字符,除了<>之外。

/[\x20-\x3B\x3D\x3F-\x7E]+/

我怀疑它...所以真的没有更可读/更容易表达a-z without x的方法吗? - KingCrunch
你可以使用字符本身作为 [ -;=?-~] - Toto

3
在正则表达式中,您可以轻松地对字符类进行并集、交集和差集操作。
[a[b]]

是联合。

[a&&b]

是交集。

[a&&[^b]]

是减法。

我经常在Java中进行相当复杂的集合操作。例如,这就是你在Java中必须使用的。

[^\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]

对于现代版本的\w。 (您不必在Perl中执行此操作,因为\w在那里并没有像Java中那样出现问题。)单词边界会变得更加困难:

(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))

但至少现在你有一个在Java中起作用的\b,而不是一个会破坏你所有操作的错误东西。要在没有\X的语言中实现它,可以使用一个被定义为遗留字形簇的东西。
(?>\PM\pM*)

或者你可以使用扩展字形簇,定义为(实际上几乎是这样):

(?:(?:\u000D\u000A)|(?:[\u0E40\u0E41\u0E42\u0E43\u0E44\u0EC0\u0EC1\u0EC2\u0EC3\u0EC4\uAAB5\uAAB6\uAAB9\uAABB\uAABC]*(?:[\u1100-\u115F\uA960-\uA97C]+|([\u1100-\u115F\uA960-\uA97C]*((?:[[\u1160-\u11A2\uD7B0-\uD7C6][\uAC00\uAC1C\uAC38]][\u1160-\u11A2\uD7B0-\uD7C6]*|[\uAC01\uAC02\uAC03\uAC04])[\u11A8-\u11F9\uD7CB-\uD7FB]*))|[\u11A8-\u11F9\uD7CB-\uD7FB]+|[^[\p{Zl}\p{Zp}\p{Cc}\p{Cf}&&[^\u000D\u000A\u200C\u200D]]\u000D\u000A])[[\p{Mn}\p{Me}\u200C\u200D\u0488\u0489\u20DD\u20DE\u20DF\u20E0\u20E2\u20E3\u20E4\uA670\uA671\uA672\uFF9E\uFF9F][\p{Mc}\u0E30\u0E32\u0E33\u0E45\u0EB0\u0EB2\u0EB3]]*)|(?s:.))

当然,如果你使用一种支持本地字符集的语言,就不必进行如此极端的重写!不幸的是,Java不是其中之一。
对于正则表达式,我建议使用更现代的语言,比如Perl、Python或Ruby。否则你就停留在石器时代了。

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