我有一个 Java 程序,它应该从字符串中删除所有非字母字符,除非它们是笑脸,例如 =) 或 =] 或 :P
很容易匹配相反的内容,[a-zA-Z ]|=\)|=\]|:P
但我不知道如何否定这个表达式。由于我使用的是 String.replaceAll() 函数,因此它必须采用否定形式。
我相信部分问题可能来自微笑通常有 2 个字符长,而我一次只匹配 1 个字符?
有趣的是,replaceAll("(?![Tt])[Oo]","")
它删除了所有出现的字母 O,即使是在单词“to”中。这是否意味着我的 replaceAll 函数不理解正则表达式前瞻?它不会抛出任何错误......
我最终使用
replaceAll("(?<![=:;])[\\]\\[\\(\\)\\/]","")
.replaceAll("[=:;](?![\\]\\[\\(\\)o0OpPxX\\/])","")
.replaceAll("[^a-zA-Z=:;\\(\\)\\[\\]\\/ ]","")
这非常混乱,但效果很好。The... quick! (brown) fox jump's over the[] lazy dog. :] =O ;X
变成THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG :] =O ;X
编辑:忽略该修复,请参阅下面接受的答案。